结构同步是唯一能安全生成差异ddl脚本的入口,必须从“工具→结构同步”启动,对应两个独立连接或同实例不同库名;比对前须校验字符集、sql_mode及排除非业务表,选项页须勾选“忽略注释”和“忽略外键名称”,并按需选择if not exists或drop if exists。
结构同步 是唯一能安全生成差异 ddl 脚本的入口,别点「数据同步」或「备份」——那不是比结构,那是清库预备动作。
必须从「工具 → 结构同步」启动流程
Navicat 没有 git 分支概念,“分支”实际对应两个独立连接(如 dev_db 和 prod_db)或同一实例下不同库名(如 myapp_v2 与 myapp_v3)。你真正要做的,是让这两个库的表结构对齐。
常见错误:误点「数据同步」→ 自动生成全量 INSERT/REPLACE,甚至删表重建;误点「备份」→ 导出的是快照,不是差异脚本。
正确路径只有一条:工具 → 结构同步 → 选源库/目标库 → 点「比对」。
比对前必须校验三件事,否则脚本八成跑不通
Navicat 不检查这些,但 MySQL 会报错:
-
字符集和排序规则是否一致(例如utf8mb4_0900_as_cs与utf8mb4_unicode_ci混用,索引可能创建失败) -
SQL_MODE是否开启严格模式(如缺STRICT_TRANS_TABLES,默认值差异会被静默忽略) - 是否手动排除了
schema_migrations、tmp_*、log_*这类非业务表(Navicat 默认全量比对,一并纳入就等于给生产库埋雷)
生成脚本时三个关键选项不勾选=白忙活
在「结构同步」向导的「选项」页(不是「高级」页),以下三项必须确认:
- ✅ 勾选「忽略对象定义中的注释」:否则字段
COMMENT变更会被识别为结构差异,生成无意义的ALTER TABLE ... COMMENT - ✅ 勾选「忽略外键名称」:MySQL 的外键名是自动生成的(如
fk_7a2b3c),不同环境必然不一致,不忽略会导致一堆虚假DROP FOREIGN KEY+ADD FOREIGN KEY - ⚠️ 「使用 IF NOT EXISTS / DROP IF EXISTS」按需选:目标库结构不确定存在?选
IF NOT EXISTS;要强制覆盖且敢承担风险?选DROP IF EXISTS—— 但注意:DROP IF EXISTS对表级操作等同于删表重建,别在生产库点「运行」
合并结构 ≠ 合并数据,别混淆两个功能
结构同步只管 CREATE TABLE、ALTER TABLE、ADD INDEX 这类 DDL;数据合并得另走一套:
- 结构对齐后,如需把
dev_db.user的新数据追加进prod_db.user,用「数据传输」功能(右键表 →「数据传输」),或写INSERT INTO target SELECT * FROM source手动执行 - 若两表有主键冲突,必须加
ON DUPLICATE KEY UPDATE(MySQL)或ON CONFLICT DO NOTHING(PostgreSQL),Navicat 不自动处理重复键逻辑 - 大表慎用界面导入:导出 SQL 再批量执行更稳,避免 Navicat 卡死或中断导致部分数据丢失
真正容易被忽略的,是「比对前没确认 SQL_MODE」和「导出脚本后没人工核对 ALTER 类型」——前者让字段默认值变更无声失效,后者可能把 ADD COLUMN 错写成 MODIFY COLUMN,直接导致线上服务报错。











