Navicat 不支持直接比对两个 .ndm 模型文件,仅支持模型与数据库或数据库之间的比对;需先将两模型分别同步至临时数据库,再通过“结构同步”功能比对差异。
Navicat 本身不直接支持「两个模型文件(.ndm)之间的差异比对」——它只能对比「模型文件 vs 数据库」,或「数据库 vs 数据库」。如果你手上有两个 .ndm 模型文件(比如开发版模型和上线版模型),想看结构差异,得绕一步:先把它们分别同步到两个临时数据库,再用结构同步功能比对。
下面说清楚怎么实操、为什么这么走、以及哪些地方一不留神就翻车。
为什么不能直接比对两个 .ndm 文件
navicat data modeler(独立建模工具)确实能打开多个模型,但它的「比较」功能只提供「模型 → 数据库」单向同步检查,没有「模型 a vs 模型 b」的并排差异视图。官方文档和实测都确认:该功能缺失。强行拖拽两个 .ndm 文件进同一个窗口,只会叠加显示,不会触发比对逻辑。
把模型导出为临时库再比对(最稳路径)
这是目前唯一可靠、可复现、且能生成真实 ALTER 脚本的方法:
- 分别用
Navicat Data Modeler打开两个.ndm文件 - 对每个模型,执行 “模型” → “同步到数据库” → 新建一个本地 MySQL 连接(如
temp_dev/temp_prod),勾选「仅创建结构,不插入数据」 - 确保两个临时库都成功建好表、索引、外键等对象(检查是否报错,特别是字段类型映射失败,比如
JSON在旧版 MySQL 不支持) - 回到
Navicat for MySQL主界面,点 “工具” → “结构同步” - 源选
temp_dev,目标选temp_prod,点击「比对」
此时看到的差异,就是两个模型在 DDL 层的真实区别。注意:目标库必须是空库或与模型完全一致的库,否则比对结果会混入无关变更。
运行同步前必须检查的三项
结构同步生成的脚本默认不加事务包裹,也不做字段值兼容性校验,直接运行可能丢数据:
- 外键依赖顺序:如果模型里新增了带外键的表,但被引用表还没建,脚本会失败。需手动在「部署脚本」页拖动语句顺序,或勾选「按依赖顺序执行」(Navicat 15+ 支持)
-
修改字段类型的风险操作:比如从
VARCHAR(50)改成VARCHAR(20),Navicat 默认生成MODIFY COLUMN,但若已有超长数据,MySQL 会报错中断。务必先查SELECT COUNT(*) FROM table WHERE LENGTH(col) > 20 -
忽略大小写敏感设置:如果源库是
lower_case_table_names=1,而目标库是=0,表名大小写不一致会导致同步误判为「新建表」而非「修改」
替代方案:用命令行导出 DDL 再 diff
如果连临时库都不想建,可以退到纯文本比对:
- 用
Navicat Data Modeler分别导出两个模型为 SQL 文件:“模型” → “逆向工程” → “导出为 SQL”(选 MySQL,勾选「仅 DDL」) - 用系统级 diff 工具(如
diff -u a.sql b.sql或 VS Code 的 Compare Files 插件)查看差异 - 缺点:无法识别逻辑等价但写法不同的 DDL(比如
INT(11) NOT NULL和INTEGER NOT NULL被当成不同),也不能自动处理依赖顺序
真正难的从来不是“怎么点”,而是判断哪一行变更会影响线上数据、哪个外键删了会断业务、哪次 MODIFY 其实该改成 ALTER ... CHANGE 加中间迁移步骤——这些 Navicat 不会提醒你,得自己盯住日志里的每一行 CREATE TABLE 和 ALTER TABLE。











