Navicat可迁移MySQL至PostgreSQL,但必须手动配置:①勾选“重置序列”防主键冲突;②JSON字段需映射为jsonb并建GIN索引;③连接高级设置中强制SET client_encoding='UTF8'防乱码;④关闭自动分批提交、禁用autovacuum提升速度。
能直接迁,但不能“无脑点开始”就完事——navicat 的数据传输功能是可行路径,但必须提前处理类型映射、主键生成逻辑和语法冲突,否则导入中途报错或数据丢失是常态。
用 Navicat 数据传输功能迁移表结构 + 数据
这是最接近“一键”的方式,但前提是两边数据库都已在 Navicat 中成功连接(PostgreSQL 和 MySQL 均需配置好驱动、认证、网络可达)。工具路径是 Tools → Data Transfer…,不是右键菜单里的“运行 SQL 文件”或“转储 SQL”。
- 源选择 PostgreSQL 连接,目标选 MySQL 连接;务必确认目标库已存在且有写权限
- 在表选择页勾选要迁移的表,建议单次只迁 1–3 张,便于定位失败点
- 点击
Options按钮,关键设置有三项:Create tables勾选(让 Navicat 自动建表)、Truncate tables before import可选(清空目标再写入)、Continue on error强烈建议勾选(避免某条 INSERT 失败就中断全量) - Navicat 默认会把 PostgreSQL 的
SERIAL字段转成 MySQL 的INT NOT NULL AUTO_INCREMENT,但不会自动加PRIMARY KEY—— 如果原表主键是id SERIAL PRIMARY KEY,目标表可能只有id INT AUTO_INCREMENT而无主键约束,后续插入会失败
手动导出 PostgreSQL 再改 SQL 导入 MySQL 的典型修改点
当数据传输失败、或需要精确控制字段注释、索引、默认值时,走 pg_dump + 手动修脚本的路径更可控。导出命令推荐用:
pg_dump -U username -d dbname -t table_name --column-inserts --no-owner --no-privileges -f output.sql
导出后必改项包括:
- 所有双引号
"替换为反引号`(MySQL 用反引号标识符,PostgreSQL 用双引号) - 删掉开头的
SET语句块(如SET client_encoding = 'UTF8'),MySQL 不识别 -
nextval('xxx'::regclass)类默认值全部删掉或替换为NULL(MySQL 没有等价函数,AUTO_INCREMENT 字段 INSERT 时应省略或写NULL) -
COMMENT ON COLUMN语句要重写成 MySQL 的COMMENT 'xxx',放在字段定义末尾,例如:name VARCHAR(255) COMMENT '用户名' - BYTEA 类型字段需改为
BLOB或LONGBLOB,并确认客户端是否启用hex编码(pg_dump 默认以十六进制导出 BYTEA,MySQL 需配合UNHEX()或改用--inserts参数避免)
常见报错及对应修复动作
导入时遇到错误别急着重来,先看错误信息里带的关键字:
-
ERROR 1064 (42000):基本是语法问题,重点检查双引号、$$字符串分隔符、RETURNING子句(MySQL 不支持)——这些在 pg_dump 输出里常出现,必须删 -
ERROR 1062 (23000): Duplicate entry:说明目标表已有数据且主键冲突,要么清空目标表,要么在 Navicat 的Data Transfer里勾选Truncate tables before import -
ERROR 1146 (42S02): Table 'xxx' doesn't exist:Navicat 没建表成功,或建表语句执行失败(比如字段名用了 MySQL 保留字如order、group),此时应单独运行建表语句查错 -
ERROR 1366 (HY000): Incorrect string value:字符集不匹配,确保导出 SQL 文件保存为 UTF-8 编码,MySQL 连接参数中指定charset=utf8mb4,建表语句含CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
真正耗时间的从来不是点击“开始”,而是验证:迁移后立刻比对行数(SELECT COUNT(*) FROM table_name)、抽样几条含中文/特殊字符/大字段的记录、检查主键自增是否正常续号。Navicat 不校验数据一致性,这步漏了,上线就出事。


















