Navicat「结构同步」是用于比对并生成差异DDL脚本的专用功能,需从“工具→结构同步”启动,勾选“仅生成SQL脚本”,并严格校验字符集、SQL_MODE及排除无关表;关键选项须勾选“忽略注释”和“忽略外键名称”,导出后须人工核对ALTER类型及索引重建逻辑。
Navicat 的「结构同步」不是「分支比对」,别直接点「同步」就走人
navicat 没有原生的 git 分支概念,所谓“不同分支的数据库结构”,实际是指两个独立连接(比如 dev_db 和 prod_db)或同一实例下两个不同库名(如 myapp_v2 与 myapp_v3)。你真正需要的是「结构同步」功能里的「结构比较」入口,而不是「数据同步」或「备份」——点错地方生成的可能是全量重建脚本,甚至误删表。
关键判断:只要目标是生成 差异 DDL 脚本(ALTER TABLE / CREATE INDEX 等),就必须从「工具 → 结构同步」启动流程,且勾选「仅生成 SQL 脚本」。
执行结构比较前必须确认的三件事
很多用户导出的脚本跑不通,90% 出在环境校验缺失。Navicat 不会自动帮你检查这些:
-
字符集和排序规则是否一致(例如utf8mb4_unicode_civsutf8mb4_0900_as_cs,MySQL 8.0+ 下不兼容会导致索引创建失败) - 源库和目标库的
SQL_MODE是否允许严格语法(如STRICT_TRANS_TABLES缺失时,某些默认值差异会被忽略) - 是否手动排除了临时表、日志表、测试表(Navicat 默认比对所有对象,
schema_migrations或tmp_user_import这类表一旦被纳入,脚本可能报错或覆盖业务数据)
生成差异脚本时最关键的三个选项设置
进入「结构同步」向导后,在「选项」页(不是「高级」页)调整以下三项,否则脚本大概率不可执行:
- 「忽略对象定义中的注释」:勾选。Navicat 会把 COMMENT 当作结构差异,但生产环境通常不靠注释驱动变更
-
「忽略外键名称」:勾选。MySQL 在 SHOW CREATE TABLE 中外键名是自动生成的(如
fk_12345),不同环境不一致,不忽略会导致大量虚假差异 - 「使用 IF NOT EXISTS / DROP IF EXISTS」:按需选择。如果目标库结构可能不存在,选「IF NOT EXISTS」;如果要强制覆盖,选「DROP IF EXISTS」——但注意:后者会删表重建立,慎用于生产
示例:你只改了一个字段类型,但没勾选「忽略外键名称」,Navicat 可能生成 5 条 DROP + CREATE 外键语句,而实际根本不需要动外键。
导出脚本后务必人工核对的两处细节
Navicat 生成的 SQL 是「可执行」但不一定是「安全」的。尤其要注意:
-
ALTER TABLE ... MODIFY COLUMN和ALTER TABLE ... CHANGE COLUMN的混用:前者不改列名,后者改。Navicat 有时会把纯类型变更写成CHANGE,导致列注释丢失(MySQL 5.7+ 中CHANGE会清空 COMMENT) - 索引重建逻辑:如果对比发现索引字段顺序不同,Navicat 默认先
DROP INDEX再CREATE INDEX,但没加ONLINE=1(MySQL)或CONCURRENTLY(PostgreSQL),大表执行会锁表
真正复杂的地方在于:Navicat 不知道你的表有多大、有没有主从延迟、下游应用是否容忍短时不可用。它只管“结构上不同”,不管“上线时能不能跑”。脚本生成只是起点,不是终点。











