Navicat Data Modeler 不支持直接比对两个 .ndm 文件,必须先打开一个模型再通过 Model → Compare Models 选择第二个文件;比对前需统一符号标准、清除不可见字符、确保 information_schema 字符集一致;导出 SQL 须手动勾选 DROP 语句、保留注释及 IF NOT EXISTS 选项。
Navicat Data Modeler 不支持直接比对两个 .ndm 模型文件——这不是功能隐藏,而是根本不存在。你点开两个模型、拖进同一窗口、甚至右键找“Compare”,都得不到结构差异列表。必须走“模型 → 数据库 → 差异比对”这一条路径。
为什么 Model → Compare Models 选项是灰色的?
这个菜单项只在「已打开 .nvm 或 .ndm 模型文件」且处于「模型编辑器」界面时才可用。如果你是从 navicat for mysql 主界面直接点开的连接,或当前标签页是 sql 查询/表数据视图,model → compare models 就永远是禁用状态。正确入口是:file → open model 加载第一个 .ndm,再通过 model → compare models 呼出对话框,然后手动选择第二个模型文件。
比对前必须统一三项底层定义
即使菜单可点、文件能选,比对结果也极可能为空或误报。因为 Navicat Data Modeler 的比对引擎对建模语义极度敏感:
- 两个模型必须使用完全相同的符号标准(
Crow's Foot/IDEF1X/UML),混用会导致外键关系不匹配,连“字段名相同”都可能被跳过 - 所有表名、字段名、约束名里不能含零宽空格、全角空格、BOM头等不可见字符——这类字符在文本编辑器里看不见,但 Navicat 会判定为“不同对象”而非“同名变更”
- 若模型来自逆向工程,两次导出时源数据库的
information_schema字符集必须一致(如都是utf8mb4);否则字段注释被截断或乱码,会被识别为“描述变更”
导出的 SQL 脚本默认不安全,必须手动干预
点击 Compare Models 后弹出的窗口右下角有 Options 按钮,这里决定脚本是否可用:
- 务必勾选
Generate DROP statements for removed objects:否则删表、删字段、删索引不会生成对应DROP语句 - 务必勾选
Preserve existing comments:否则字段注释只要差一个标点,就生成COMMENT ON COLUMN,而 MySQL 5.7 及更早版本根本不支持该语法 - 勾选
Use IF NOT EXISTS for CREATE statements可避免目标库已有对象时脚本中断,但注意 PostgreSQL 需 v12+ 才完整支持该语法在索引和约束上 - 导出的 SQL 默认无事务包装,如需原子执行,得手动加
START TRANSACTION和COMMIT(MySQL)或BEGIN TRANSACTION(SQL Server/PostgreSQL)
真正影响落地的细节常被忽略
生成的脚本看起来完整,但执行时仍可能失败。最典型的三个盲区:
-
外键依赖顺序未自动调整:比如新增了orders表并引用users,但users表还没建,脚本会卡在第一条CREATE TABLE orders—— 必须进「部署脚本」页手动拖动顺序,或启用 Navicat 15+ 的「按依赖顺序执行」 -
字段类型收缩无预警:从VARCHAR(100)改成VARCHAR(20),Navicat 默认生成MODIFY COLUMN,但若已有超长数据,MySQL 直接报错中断。必须提前查SELECT COUNT(*) FROM t WHERE LENGTH(c) > 20 -
大小写敏感设置未同步:源库lower_case_table_names=1(表名小写存储),目标库是=0,Navicat 会把Users和users当作两个不同表,误判为“新建”而非“修改”











