公司業務量 50 萬用戶,經多次升級驗證,決定將後台數據庫從 MySQL 整體遷移至 PostgreSQL 8.x,獲得更強的標準兼容性、複雜查詢優化器與企業級特性。
mysqldump -h [host] -u [user] -p[pass] --extended-insert=false [dbname] > mysql-db.sql
關鍵: --extended-insert=false 生成單行 INSERT,PostgreSQL 不支持 MySQL 多值語法。
自研工具 mysql2psql 處理方言差異:
AUTO_INCREMENT → PG SERIAL / IDENTITY。BACKTICKS → PG 雙引號或無引號。TINYINT→SMALLINT,MEDIUMTEXT→TEXT,ENUM/SET→CHECK CONSTRAINT 或 DOMAIN。IF()→CASE,NOW()→CURRENT_TIMESTAMP,CONCAT()→||,DATE_FORMAT→TO_CHAR。/*! ... */)。mysql2psql mysql-db.sql postgres-db.sql
使用 pgAdmin 執行轉換後腳本,或命令行:
psql -U postgres -d newdb -f postgres-db.sql
| 差異點 | MySQL | PostgreSQL |
|---|---|---|
| GROUP BY | 允許非聚合列不在 GROUP BY 中 | 嚴格:SELECT 列必須在 GROUP BY 或聚合函數中 |
| JOIN 語法 | 支持舊式 WHERE a.id=b.id | 推薦標準 JOIN ... ON,舊式易報錯 |
| LIMIT/OFFSET | LIMIT offset, count | LIMIT count OFFSET offset |
| 字符串拼接 | CONCAT(a,b) | a || b |
| 當前時間 | NOW() | CURRENT_TIMESTAMP |
| 自增 ID 獲取 | LAST_INSERT_ID() | RETURNING id 或 currval() |
| REPLACE INTO | 支持 | 用 INSERT ... ON CONFLICT DO UPDATE |