Navicat 16无独立“模型vs数据库”结构比对入口,Sync to Database仅在部署流程中触发差异预览,需点击「比较」后切换至DDL比较标签页才能查看CREATE/ALTER/DROP列表。

Model → Sync to Database 不能直接做“模型 vs 数据库”结构比对
Navicat 16 没有独立的「模型 vs 数据库结构比对」入口。所谓“对比差异”,实际是通过 Sync to Database 流程触发的预览动作——它不先展示 diff,而是直接进入部署脚本生成阶段。如果你只想看差什么、不打算立刻执行,必须在弹出窗口里点「比较」按钮,再切到 DDL 比较 标签页才能看到 CREATE/ALTER/DROP 列表。
常见错误现象:Sync to Database 菜单项灰色不可点,是因为当前没在模型编辑器界面;或者你打开的是 .ndm 文件但没用「设计模型」按钮进入编辑态,而是在只读视图下操作。
- 必须先用
File → Open Model加载模型,再点击画布空白处右键 →Sync to Database - 目标数据库连接需提前配置好,并在同步对话框中手动选择(不能靠自动识别)
- 若模型里某张表名和数据库中同名表字段数一致但类型不同(比如模型是
VARCHAR(100),库中是VARCHAR(50)),Navicat 默认不会提示“类型变更”,只会列为ALTER TABLE ... MODIFY COLUMN—— 但这个语句是否安全,得你自己判断
比对前必须确认模型结构合法且已保存
未保存的模型或存在语法缺陷的结构会导致比对跳过整张表,甚至静默失败。Navicat 不会报错说“这张表缺主键所以不比”,而是直接忽略它。
- 所有表必须设置主键:右键表 →
Edit Table→ 勾选至少一个字段的PK复选框 - 字段类型要兼容目标库:MySQL 5.7 不支持
JSON类型,PostgreSQL 不认TINYINT;这类字段在比对时会被跳过,也不生成任何提示 - 字符集必须显式指定:模型中每张表的
Collation属性要设为utf8mb4_unicode_ci等实际可用值,否则同步后可能变成latin1_swedish_ci,中文注释全乱码 - 保存模型文件(如
auth_model.nmmp)是强制前置步骤;临时未命名模型无法参与同步流程
DDL 比较窗口里的语句不是“建议”,而是即将执行的真实 SQL
很多人误以为「部署脚本」窗口只是示意,点了「部署」就自动执行。其实它默认不加事务、不校验依赖顺序、也不跳过失败语句——哪怕第一条 CREATE TABLE 就报错,后续语句照常发给数据库。
- 务必切换到
DDL 比较标签页,逐条检查是否含NOT NULL、DEFAULT、AFTER等关键修饰符;例如新增created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,若存量数据为空,执行必报错 - 勾选
遇到错误时继续只适用于纯建表场景,绝不适用于带数据迁移或外键变更的环境 - 点击
在查询编辑器打开脚本后,手动加上BEGIN;和ROLLBACK;先测试,确认无误再改COMMIT; - Navicat 不处理跨库引用:如果模型里有
FOREIGN KEY (ref_id) REFERENCES other_db.users(id),它不会检查other_db是否存在、权限是否足够
真正影响落地的细节常被忽略
比对结果里显示 ADD COLUMN status TINYINT,不代表你能直接执行。MySQL 5.7 下 TINYINT 在 Navicat 模型里可能被映射成布尔语义,但目标库若为 PostgreSQL,则需改成 BOOLEAN;而 Navicat 不会提醒你这层适配问题。
另外,ENUM 类型值顺序变化、GENERATED COLUMN 的表达式变更、字段注释里多了个空格——这些都不会触发明显差异标记,却可能破坏应用层序列化逻辑或导致 ORM 映射失败。


















