Navicat结构同步可能丢字段,需确认同步方向与对比模式;默认“结构对比”不涉及数据;预览SQL时重点检查DROP COLUMN;MySQL 8.0+需设正确版本避免零日期错误;PostgreSQL需注意schema和权限;大库同步建议导出SQL手动执行。
Navicat 结构同步会丢字段?先确认「同步方向」和「对比模式」
结构同步不是单向覆盖,而是依赖你选的「源数据库」和「目标数据库」——选反了就真把生产库字段删了。navicat 默认用「结构对比」模式,但这个模式只比对表、列、索引、外键等 ddl 元素,完全不看数据内容,所以别指望它同步测试数据。
-
右键目标库 → “结构同步”时,弹窗里上方是源(要参考的结构),下方是目标(将被修改的库)——务必核对清楚 - 点击
“选项”,勾选“忽略列顺序”,否则字段顺序不同会被误判为「删除+新增」 - 取消勾选
“删除目标中不存在的对象”,除非你明确要清掉目标库的冗余表或索引 - 首次同步前,务必在
“预览SQL”页签里逐条检查生成的语句,重点关注DROP COLUMN和ALTER TABLE ... DROP FOREIGN KEY
MySQL 8.0+ 同步失败:datetime 默认值引发语法错误
Navicat 旧版本(≤16.0)生成的同步 SQL 在 MySQL 8.0+ 上可能报错 Invalid default value for 'created_at',本质是它仍按 MySQL 5.7 规则写 DEFAULT '0000-00-00 00:00:00',而 8.0 默认启用了 NO_ZERO_DATE 模式。
- 解决方法:在同步前,进
“选项” → “高级”,把“MySQL 版本”显式设为8.0或更高 - 若已报错,手动编辑预览 SQL,把零日期改成
CURRENT_TIMESTAMP或NULL,再执行 - 更稳妥的做法:在源库建表时就避开零日期,默认用
CURRENT_TIMESTAMP,Navicat 能正确识别并复用
PostgreSQL 同步后函数/视图没更新?注意 schema 和权限隔离
PostgreSQL 的 public 不是唯一 schema,Navicat 默认只同步当前连接用户默认 schema(通常是 public),其他 schema 下的对象压根不会出现在对比列表里。
- 同步前,在连接设置里确认
“默认 Schema”是否为你想操作的 schema(如app或data) - 如果要跨 schema 同步,得分别建立两个连接,每个连接指定对应 schema,再单独做结构同步
- 函数和视图的
OWNER和GRANT权限不会被同步——Navicat 的结构同步只管 DDL,不管ALTER FUNCTION ... OWNER TO这类语句 - 视图定义含换行或注释时,Navicat 可能解析出错,建议先用
pg_dump --schema-only校验源视图 DDL 是否规范
同步脚本执行卡住或超时:别硬等,改用「分批导出 SQL + 手动执行」
当库中有上百张表、或含大文本字段(TEXT, JSONB)的表参与同步时,Navicat 内置执行器容易因网络抖动或锁等待卡死,且无法中断重试。
- 果断放弃
“运行”按钮,点“保存SQL到文件”,生成一个 .sql 文件 - 用命令行执行:
psql -h host -U user -d db_name -f sync.sql(PostgreSQL)或mysql -h host -u user -p db_name (MySQL) - 执行前在 SQL 文件头部加
SET lock_timeout = '30s';(PG)或SET innodb_lock_wait_timeout = 30;(MySQL),避免长事务阻塞 - 如果某张表同步失败,直接注释掉对应 SQL 段,修复后再补跑,比重来整套安全得多
真正麻烦的从来不是点几下按钮,而是同步前没确认好 schema 上下文、没关掉自动 DROP、没看清 MySQL 版本适配——这些地方一漏,回滚成本远高于重做一次同步。










