navicat 16 不支持真正的版本依赖分析,仅做表级物理结构比对,无法解析sql脚本逻辑依赖或迁移框架changelog;依赖关系需通过带序号的ddl文件命名(如v001_*.sql)和git提交历史人工管理。

Navicat 16 无法做真正的版本依赖分析——它不解析 SQL 脚本间的逻辑依赖,也不读取 Liquibase/FluentMigrator 等迁移框架的 changelog 结构。 所有“依赖”判断都停留在表级物理结构比对层面,比如 A 表加了外键指向 B 表,它能识别“B 表必须存在”,但无法知道这个外键是第 3 个 migration 加的、是否依赖前一个索引创建步骤。真要落地,得绕开 Navicat 的模型文件,用可文本化、可追溯的 DDL 脚本替代。
为什么 Compare Models 不等于依赖分析
Navicat Data Modeler 的 Model → Compare Models 只比字段名、类型、主外键声明是否一致,不追踪变更时序或执行约束:
- 两个模型里都有
t_user表,但模型 A 是从 MySQL 5.7 逆向工程来的(含TINYINT),模型 B 是手动新建的(用了BOOLEAN),比对结果只标“类型不同”,不会提示“该变更需先升级数据库版本” - 若模型 A 中
t_order的外键引用了t_customer.id,而模型 B 把t_customer改名为t_client,Navicat 会报“外键目标表不存在”,但不会告诉你“这个重命名必须在所有引用它的外键被删掉之后执行” - 模型文件(
.ndm)是二进制的,Git 无法 diff 出“第 5 行字段注释从‘用户昵称’改成‘用户显示名’”,也就没法基于 commit 历史回溯依赖链
用 Export SQL + Git 实现轻量级依赖管理
把模型“翻译”成带顺序编号的 DDL 文件,才是 Navicat 16 下最可行的路径:
- 每次模型修改后,右键模型 →
Export SQL File→ 勾选“生成 CREATE TABLE 语句”“包含外键”“兼容目标数据库版本”(如MySQL 8.0) - 导出文件按约定命名:
V001_initial_schema.sql、V002_add_created_at_to_orders.sql,确保文件名本身体现执行顺序 - 提交到 Git 时,检查 diff 是否符合预期:新增字段是否带
NOT NULL DEFAULT?外键是否含ON DELETE CASCADE?这些细节决定能否无错执行 - 若某次变更需分两步(如先加列再填默认值),就拆成两个 SQL 文件,而不是塞在一个文件里靠注释说明——Navicat 不解析注释里的执行逻辑
同步前必须人工核对的三类隐性依赖
Navicat 生成的部署脚本(Synchronize to Database 弹窗里的 SQL)默认忽略这些上下文,但它们直接影响执行成败:
-
ALTER TABLE语句中新增NOT NULL字段时,若表已有数据,Navicat 默认不加DEFAULT值,脚本会直接报错;你得手动补上DEFAULT ''或先跑UPDATE再改结构 - 索引名未显式指定时,Navicat 可能生成随机名(如
idx_7f3a2),导致两次导出的 SQL 在 Git 中大量“无意义变更”,干扰真实依赖判断 - MySQL 8.0+ 的隐藏主键(
invisible primary key)或 PostgreSQL 的GENERATED BY DEFAULT AS IDENTITY,Navicat 导出时常省略,若下游系统依赖这些特性,就得在 SQL 文件里手动补全
真正卡住上线的,往往不是 Navicat 没比出来的差异,而是它比出来了却没告诉你“这个 ALTER 必须在另一个表重建索引之后才能跑”。所以别把 Compare Models 当依赖分析器用,把它当一个结构快照校验工具更实际——依赖关系,得靠人写进 SQL 文件名和 Git commit message 里。











