将系统的数据库从MySQL 5.5迁移到PostgreSQL 9.1(一)

2014-11-24 15:36:03 · 作者: · 浏览: 0

将系统的 数据库从MySQL 5.5迁移到PostgreSQL 9.1
环境
Windows Server 2003 x64 简体中文, MySQL 5.5 (UTF8编码), PostgreSQL 9.1.4-1 (UTF8编码)
Spring 3.0.7, Struts 2.3.4, Hibernate 3.5.5
从MySQL迁移到PostgreSQL
* DDL定义中的各种写法区别
** 前者可用符号"`"(不含引号,在键盘上是Esc键下面的那个键对应的字符)来包裹住表名、列名等,后者不可以。
* 转义字符
MySQL www.2cto.com \
PostgreSQL 默认不支持惯用的\,而是用的英文单引号'
* 使用DB
MySQL中可以 use DB名;
PostgreSQL中不支持 use 关键词!
* 主键约束
二者没什么区别
* 自增长主键
MySQL中写成这样
CREATE TABLE users (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
PRIMARY KEY (id)
);
PostgreSQL中写成这样
CREATE TABLE users(
id serial NOT NULL,
name VARCHAR(50) NOT NULL,
PRIMARY KEY (id )
);
注: PostgreSQL会对 serial数据类型的列隐式生成名为 表名_PK名_seq 的SEQUENCE,此例的SEQUENCE名为 users_id_seq 。
* 改变已有表的自增长序列
01 www.2cto.com
-- 更安全有效的解决方案请参考http://stackoverflow.com/questions/244243/how-to-reset-postgres-primary-key-sequence-when-it-falls-out-of-sync/* 假如有表a从MySQL迁移过来,其中有数据100条,若在建立此表时没有指定序列,PG会默认给此表的主键列一个
02
sequence——它是增长的,幅度为1。此时若用Hibernate来给表a添加数据会报错,说主键1已经存在!
03
所以可以在迁移表之后,将表的sequence作少许修改,让其从当前表的主键的最大值再加1来开始!即可解决
04
Hibernate添加数据时报错的问题
05
06
ALTER SEQUENCE "public"."表名_主键名_seq" RESTART WITH (PK的最大值 + 1);
07
08
ALTER SEQUENCE 表名_主键名_seq RESTART WITH (PK的最大值 + 1);
09
10
e.g.
11
ALTER SEQUENCE file_types_id_seq" RESTART WITH 10;
12 www.2cto.com
13
从上面stackoverflow.com网站上得到的更加简单有效的一句SQL语句如下:
14
SELECT pg_catalog.setval(pg_get_serial_sequence('table_name', 'id'), (SELECT MAX(id) FROM table_name)+1);
15
16
*/
* 唯一键约束
MySQL UNIQUE KEY name (name)
PostgreSQL UNIQUE (name)
* 内置SQL函数区别
MySQL格式化日期 DATE_FORMAT(CURRENT_TIMESTAMP,'%Y-%m-%d %H:%i:%s')
PostgreSQL格式化日期 to_char(CURRENT_TIMESTAMP,'yyyy-mm-dd hh24:mi:ss')
* 日期类型
MySQL date time datetime
PostgreSQL timestamp
* 布尔类型
MySQL 木有,可用int(1)、枚举或者字符串的方式来模拟。
PostgreSQL boolean
www.2cto.com
* 外键约束
在MySQL中创建带有外键的表写法如下:
01
DROP TABLE IF EXISTS recipient_recipientgroup;
02
03
CREATE TABLE IF NOT EXISTS recipient_recipientgroup (
04
id serial NOT NULL,
05
recipient_id INTEGER DEFAULT NULL,
06
recipient_group_id INTEGER DEFAULT NULL,
07
PRIMARY KEY (id),
08
KEY FK_recipient_recipientgroup_recipient (recipient_id),
09
KEY FK_recipient_recipientgroup_recipient_group (recipient_group_id),
10
CONSTRAINT FK_recipient_recipientgroup_recipient FOREIGN KEY (recipient_id) REFERENCES recipient (id),
11
CONSTRAINT FK_recipient_recipientgroup_recipient_group FOREIGN KEY (recipient_group_id) REFERENCES recipient_group (id)
12
);
在 PostgreSQL 中创建带有外键的表写法如下: (即在MySQL的写法上去掉 KEY ... 这句!)
01
DROP TABLE IF EXISTS recipient_recipientgroup;
02
03
CREATE TABLE IF NOT EXISTS recipient_recipientgroup (
04 www.2cto.com
id serial NOT NULL,
05
recipient_id INTEGER DEFAULT NULL,
06
recipient_group_id INTEGER DEFAULT NULL,
07
PRIMARY KEY (id),
08
-- KEY FK_recipient_recipientgroup_recipient (recipient_id),
09
-- KEY FK_recipient_recipientgroup_recipient_group (recipient_