數據庫遷移:MySQL->PostgreSQL注意問題彙總(基於項目並不完整)

因爲項目原因,需要把原來MySQL數據庫上的數據全部遷移到PostgreSQL。兩者都是很優秀的開源數據庫,但在國內,MySQL要比PostgreSQL普及,看資料PostgreSQL在處理高併發和數據類型支持上要好於MySQL,這也是我們項目進行數據庫遷移的主要原因。

在遷移過程中,我主要遇到了一下幾個問題:

1 部分數據類別不通用

在項目中遇到了主要以下幾種數據類別需要轉換(前面爲MySQL數據類別,後面爲PostgreSQL,數據類別括號中的n表示具體數字):

bigint(n)->bigint;

double->double precision或者float8;

datetime->timestamp;

項目中用到的差不多就這些,其餘的用到再查。

2.命名規則和大小寫

在MySQL中,有關數據庫,表名和字段的命名,會採用“··”符號(即鍵盤上Esc鍵下面的印有~符號的鍵)而這在PostgreSQL中是不允許的,PostgreSQL中要麼使用雙引號包起來,要麼直接不加任何標記。

MySQL創建表sys_user:

CREATE TABLE `sys_user` (
  `USER_ID` varchar(100) NOT NULL,
  `USERNAME` varchar(255) DEFAULT NULL,
  `PASSWORD` varchar(255) DEFAULT NULL,
  `NAME` varchar(255) DEFAULT NULL,
  `RIGHTS` varchar(255) DEFAULT NULL,
  `ROLE_ID` varchar(100) DEFAULT NULL,
  `LAST_LOGIN` varchar(255) DEFAULT NULL,
  `IP` varchar(100) DEFAULT NULL,
  `EMAIL` varchar(32) DEFAULT NULL,
  `NUMBER` varchar(100) DEFAULT NULL,
  `PHONE` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`USER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
用PostgreSQL創建表sys_user:
CREATE TABLE sys_user (
  USER_ID varchar(100) NOT NULL,
  USERNAME varchar(255) DEFAULT NULL,
  PASSWORD varchar(255) DEFAULT NULL,
  NAME varchar(255) DEFAULT NULL,
  RIGHTS varchar(255) DEFAULT NULL,
  ROLE_ID varchar(100) DEFAULT NULL,
  LAST_LOGIN varchar(255) DEFAULT NULL,
  IP varchar(100) DEFAULT NULL,
  EMAIL varchar(32) DEFAULT NULL,
  PHONE varchar(32) DEFAULT NULL,
  PRIMARY KEY (USER_ID)
);

在這裏還有特別重要的一點需要注意,在PostgreSQL中,如果表名,字段名不加雙引號,則建表的時候都會被默認轉換爲小寫,如果想在命名中包括大寫必須用雙引號包起來。

3.實現表中某字段的自增

在MySQL中實現該功能很簡單,如下面腳本所示:
CREATE TABLE `sys_file` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `filename` varchar(1000) NOT NULL,
  `renames` varchar(1000) NOT NULL,
  `path` varchar(10000) NOT NULL,
  `userid` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=170 DEFAULT CHARSET=utf8;

在上面MySQL腳本中,表sys_file中id字段就實現了自增,即有新的數據插入時id會自動增加,可以看到在MySQL中有關鍵字AUTO_INCREMENT即可實現。
在PostgreSQL中的實現:

CREATE SEQUENCE sys_file_id_seq INCREMENT BY 1 MINVALUE 1 NO MAXVALUE START WITH 170;
CREATE TABLE sys_file (
  id bigint NOT NULL DEFAULT NEXTVAL('sys_file_id_seq'),
  filename varchar(1000) NOT NULL,
  renames varchar(1000) NOT NULL,
  path varchar(10000) NOT NULL,
  userid varchar(200) NOT NULL,
  PRIMARY KEY (id)
);

從腳本可以看到在PostgreSQL中實現自增還需要生成一個sequence再調用它才能實現。在生成sequence語句中,後面有幾個參數,從左到右依次表示:該序列的步長,允許最小值,允許最大值(在上面代碼中爲NO MAXVALUE即沒定義最大值),起始值。

4.時間戳的更新

在MySQL實現如下代碼所示:
CREATE TABLE `sys_file` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `filename` varchar(1000) NOT NULL,
  `renames` varchar(1000) NOT NULL,
  `path` varchar(10000) NOT NULL,
  `createtime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `userid` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=170 DEFAULT CHARSET=utf8;
如上述代碼中新增的createtime字段,就實現了時間戳的自動更新(ON UPDATE CURRENT_TIMESTAMP),在PostgreSQL中的實現較爲複雜:

CREATE TABLE sys_file (
  id bigint NOT NULL DEFAULT NEXTVAL('sys_file_id_seq'),
  filename varchar(1000) NOT NULL,
  renames varchar(1000) NOT NULL,
  path varchar(10000) NOT NULL,
  createtime timestamp,
  userid varchar(200) NOT NULL,
  PRIMARY KEY (id)
);

CREATE OR REPLACE FUNCTION update_timestamp_sys_file()
RETURNS TRIGGER AS $$
BEGIN
   NEW.createtime = now(); 
   RETURN NEW;
END;
$$ language 'plpgsql';

CREATE TRIGGER update_sys_file_createtime BEFORE UPDATE
    ON sys_file FOR EACH ROW EXECUTE PROCEDURE 
    update_timestamp_sys_file();
如上述代碼所示,在PostgreSQL中實現該功能,首先需要創建函數(CREATE OR REPLACE FUNCTION update_timestamp_sys_file()),然後創建觸發器(CREATE TRIGGER)。

5. 註解的實現

MySQL:
CREATE TABLE `sys_link` (
  `stiename` varchar(100) DEFAULT NULL COMMENT '友情鏈接網站名稱',
  `sitecontent` varchar(200) DEFAULT NULL COMMENT '友情鏈接網站內容',
  `type` char(2) DEFAULT '0' COMMENT '類型  0爲文字連接,1爲圖片連接',
  `stieurl` varchar(200) DEFAULT NULL COMMENT '圖片連接地址',
  `addtime` varchar(50) DEFAULT NULL COMMENT '添加時間',
  `uptime` varchar(50) DEFAULT NULL COMMENT '修改時間',
  `status` char(2) DEFAULT '0' COMMENT '狀態  0爲未啓用,1爲啓用',
  `sequence` int(10) DEFAULT NULL COMMENT '排序',
  `tourl` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
如上述代碼所示,在MySQL實現註解只需在字段後面加上‘COMMENT’即可,在PostgreSQL中實現如下所示:

CREATE TABLE sys_link (
  sitename varchar(100) DEFAULT NULL,
  sitecontent varchar(200) DEFAULT NULL,
  type char(2) DEFAULT '0',
  siteurl varchar(200) DEFAULT NULL,
  addtime varchar(50) DEFAULT NULL,
  uptime varchar(50) DEFAULT NULL,
  status char(2) DEFAULT '0',
  sequence int DEFAULT NULL,
  tourl varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
);
COMMENT ON COLUMN sys_link.id IS '友情鏈接ID';
COMMENT ON COLUMN sys_link.sitename IS '友情鏈接網站名稱';
COMMENT ON COLUMN sys_link.sitecontent IS '友情鏈接網站內容';
COMMENT ON COLUMN sys_link.type IS '類型  0爲文字連接,1爲圖片連接';
COMMENT ON COLUMN sys_link.siteurl IS '圖片連接地址';
COMMENT ON COLUMN sys_link.addtime IS  '添加時間';
COMMENT ON COLUMN sys_link.uptime IS '修改時間';
COMMENT ON COLUMN sys_link.status IS '狀態  0爲未啓用,1爲啓用';
COMMENT ON COLUMN sys_link.sequence IS '排序';

發佈了24 篇原創文章 · 獲贊 14 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章