作者:手机用户2602933827 | 来源:互联网 | 2014-05-28 15:41
由于项目需要,需要将mysql数据库转为PostgreSQL数据库。大概的整理下了。一、mysql表CREATETABLE`ss_users`(`ID`int(11)NOTNULLauto_increment,`PASSWD`varchar(200)NOTNULL,`NAME`varchar(80)NOTNULL,`R
由于项目需要,需要将mysql数据库转为 PostgreSQL数据库。大概的整理下了。
一、mysql表
CREATE TABLE `ss_users` (
`ID` int(11) NOT NULL
auto_increment,
`PASSWD` varchar(200) NOT NULL,
`NAME` varchar(80) NOT NULL,
`REALNAME` varchar(80) default
NULL,
`EMAIL` varchar(200) default NULL,
`Depart_ID` int(11) unsigned zerofill default
NULL,
`STATUS` int(2) default NULL,
`DESCN` varchar(255) default NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `ss_role_resc` (
`id` int(11) NOT NULL
auto_increment,
`ROLE_ID` int(11) NOT NULL,
`RESC_ID` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- Table "ss_users" DDL CREATE TABLE `ss_users` ( `ID` int(11) NOT NULL auto_increment, `PASSWD` varchar(200) NOT NULL, `NAME` varchar(80) NOT NULL, `REALNAME` varchar(80) default NULL, `EMAIL` varchar(200) default NULL, `Depart_ID` int(11) unsigned zerofill default NULL, `STATUS` int(2) default NULL, `DESCN` varchar(255) default NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `ss_role_resc` ( `id` int(11) NOT NULL auto_increment, `ROLE_ID` int(11) NOT NULL, `RESC_ID` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
对应的 postgresql表:
DROP TABLE ss_users;
CREATE TABLE ss_users
(
id serial NOT NULL,
passwd varchar(200) NOT NULL,
name varchar(100) NOT NULL,
realname varchar(100),
email varchar(200),
depart_id int8 NOT NULL DEFAULT 0,
status int2 NOT NULL DEFAULT 1,
descn varchar(255),
CONSTRAINT ss_users_pkey PRIMARY KEY
(id)
)
WITHOUT OIDS;
ALTER TABLE ss_users OWNER TO postgres;
CREATE TABLE ss_role_resc (
id serial NOT NULL,
ROLE_ID int2 NOT NULL,
RESC_ID int2 NOT NULL,
CONSTRAINT ss_role_resc_pkey PRIMARY KEY
(id)
)
-- Table: ss_users DROP TABLE ss_users; CREATE TABLE ss_users ( id serial NOT NULL, passwd varchar(200) NOT NULL, name varchar(100) NOT NULL, realname varchar(100), email varchar(200), depart_id int8 NOT NULL DEFAULT 0, status int2 NOT NULL DEFAULT 1, descn varchar(255), CONSTRAINT ss_users_pkey PRIMARY KEY (id) ) WITHOUT OIDS; ALTER TABLE ss_users OWNER TO postgres; CREATE TABLE ss_role_resc ( id serial NOT NULL, ROLE_ID int2 NOT NULL, RESC_ID int2 NOT NULL, CONSTRAINT ss_role_resc_pkey PRIMARY KEY (id) )
大概整理了下转化的一些要点。
表对应:
1、MYSQL 的 ID 唯一键 对应 PostgreSQL中的 serial字段。
2、varchar 都一样,注意字符数。
3、int float double 都有对应的字段
4、字段如果有 “`”,去掉。
5、PostgreSQL 是大小写区分的。默认导进去的sql语句都会转为小写。
6、datetime 对应 TIMESTAMP ,date,time 分别都有对应。 PostgreSQL 有 默认 DEFAULT
now()。
导入数据:
1、记得带上分号。
2、表 `ss_users` 的 两个 ` 去掉。
3、数据中 如果是双引号 改为 单引号。
可能出现的几个错误:
1、postgres默认安装好像不支持hibernate自增长。会提示hibernate_sequence不存在。
执行CREATE SEQUENCE hibernate_sequence INCREMENT 1 MINVALUE 1
MAXVALUE 9223372036854775807 START 1
CACHE 1;即可创建postgres的hibernate自增长支持
2、导出的sql语句 导入到PostgreSQL中的时候 可能出现下面的错误。
language "plpgsql" already exists
把下面注释掉,就可以。
--
-- Name: plpgsql; Type: PROCEDURAL LANGUAGE; Schema: -; Owner:
--
3、Postgres另一个小问题上,它的"serial"数据类型(等价于MYSQL的auto_increment)会造成一个"sequence"。如果从
mysql中批量导入数据,会存在 自动 department_id_seq 下的 START 1
不自动增加。解决方法,直接用pgadmin管理更改
。