Model → Compare Models 选项灰色是因为未在模型编辑器界面打开 .ndm 或 .nvm 文件;正确操作是通过 File → Open Model 加载第一个模型并确保焦点在其画布上,才能启用该菜单。

Model → Compare Models 选项为什么是灰色的
这个菜单项只在「已打开一个 .ndm 或 .nvm 模型文件」且当前处于模型编辑器界面时才可用。如果你是从 Navicat 主连接列表直接点开的数据库、或当前标签页是 SQL 查询/表数据视图,Model → Compare Models 就永远禁用。
正确路径是:File → Open Model 加载第一个 .ndm 文件 → 确保焦点落在该模型画布上 → 再点击 Model → Compare Models,此时对话框才会弹出,供你选择第二个 .ndm 文件。
常见误操作包括:
- 双击两个 .ndm 文件让它们在不同标签页打开——Navicat 不认为这是“已加载模型用于比对”,只是并列展示
- 从主界面右键某个连接选“逆向工程为模型”,生成后没手动保存为 .ndm 就直接尝试比对——临时模型不触发
Compare Models启用 - 模型文件被其他程序占用(如用文本编辑器打开过),导致 Navicat 加载失败但无明显报错,菜单仍灰
比对前必须统一三项底层建模设定
Navicat Data Modeler 的比对引擎不做模糊匹配,它按符号语义逐对象校验。三项不一致,差异结果基本不可信:
-
Crow's Foot/IDEF1X/UML符号标准必须完全相同。混用会导致外键连线逻辑被忽略,连字段名一致都可能被跳过 - 所有表名、字段名、约束名中不能含零宽空格、全角空格、BOM 头等不可见字符——这类字符在 VS Code 里需开启“显示不可见字符”才能看到,但 Navicat 会判定为“不同对象”而非“同名变更”
- 若模型来自逆向工程,两次导出源库的
information_schema字符集必须一致(如都是utf8mb4)。否则字段注释被截断或乱码,会被识别为“描述变更”,而非“无变化”
导出的 SQL 脚本默认不包含 DROP 和 IF NOT EXISTS
点击 Compare Models 后弹出的窗口右下角有 Options 按钮,这里决定脚本是否可直接执行:
- 不勾选
Include DROP statements→ 删除表、字段、索引不会生成对应DROP TABLE/ALTER TABLE DROP COLUMN语句 - 不勾选
Preserve comments→ 字段注释只要差一个标点,就生成COMMENT ON COLUMN,而 MySQL 5.7 及更早版本根本不支持该语法 - 勾选
Use IF NOT EXISTS for CREATE statements可避免目标库已有对象时脚本中断,但注意 PostgreSQL 需 v12+ 才完整支持该语法在索引和约束上
导出的 SQL 默认无事务包装。如需原子执行,得手动加 START TRANSACTION 和 COMMIT(MySQL)或 BEGIN TRANSACTION(PostgreSQL/SQL Server)。
真正影响落地的三个盲区
生成的脚本看起来完整,但执行时仍可能失败。最常被忽略的三点是:
- 脚本不检查跨库依赖。比如模型 A 中某视图引用了
other_db.table_x,但模型 B 没有该库定义,Navicat 不会提示缺失上下文,只会生成孤立的CREATE VIEW - 外键命名冲突未预警。两个模型中同名外键指向不同主表,Navicat 会生成
ADD CONSTRAINT ... FOREIGN KEY,但目标库若已存在同名约束,执行直接报错ERROR 1022 (HY000): Can't write; duplicate key in table - 自增起始值、AUTO_INCREMENT 值、存储引擎参数(如
ROW_FORMAT、KEY_BLOCK_SIZE)这些元数据差异默认不纳入比对范围,除非你在Options中主动勾选Compare physical properties
比对不是一次点击就能闭环的事。模型语义比数据库结构更抽象,很多“看起来一样”的设计,在 Navicat 的解析规则下就是两个独立对象——尤其当命名习惯不统一、建模阶段未启用术语表时,人工核对 DDL 差异仍是不可跳过的环节。











