navicat 17 不支持 er 模型与物理库的双向实时增量同步,仅支持单次反向工程覆盖;“同步到模型”按钮仅在新建模型时有效,已有模型无法更新,且不保留布局、注释等可视化信息。
navicat 17 不支持 er 模型与物理库的双向实时增量同步。所谓“同步模型”,只是单次反向工程覆盖,没有监听、没有触发、不自动识别变更,更谈不上“实时”或“增量”。
“同步到模型”按钮根本不会更新已有模型
右键点击表 → “同步到模型”,这个操作只在新建模型时有效;一旦模型已存在,点它毫无反应。Navicat 不会扫描数据库结构变化,也不会比对字段增删、类型修改、外键变动——它压根不维护模型和库之间的状态映射关系。
- 模型必须是通过「逆向工程」首次生成的(即从库拉取结构建模),否则后续无法被识别为可更新目标
- 表名必须完全一致,大小写敏感(尤其在 Linux 下的 MySQL)
- 数据库端的 DDL 变更(如
ALTER TABLE)必须已执行成功,且 Navicat 连接用户有SELECT权限读取INFORMATION_SCHEMA - 若模型中手动改过字段名或加了注释,反向工程会直接覆盖,不合并也不提示
真正能更新模型的操作是「反向工程」而非「同步」
要让模型反映最新库结构,必须走「文件 → 新建模型 → 选择数据库连接 → 逆向工程」流程,然后手动用新模型替换旧模型。这不是增量更新,而是全量重建:
- 不保留原模型中的布局、分组、颜色标记、备注框等可视化信息
- 外键关系可能因约束名不一致而丢失(例如源库用
fk_user_profile,模型里记的是user_profile_fk) - 若库中存在视图、存储过程等对象,逆向工程默认不勾选,需手动开启对应选项才能导入
- 跨库同步场景下(如 Oracle ↔ SQL Server),字段类型映射可能失真(
NUMBER(10,2)→DECIMALvsMONEY),需人工核对
为什么不能做成真正的双向增量同步?
因为 Navicat 的模型层和数据库层之间没有变更捕获机制:
- 它不监听
binlog、redo log或SQL Server CDC,无法感知哪条 DDL 是何时执行的 - 模型文件(
.ndm)是静态 JSON+二进制混合格式,不带版本号或时间戳,无法做 diff - 没有类似 Liquibase 的
databasechangelog表来记录模型与库的差异基线 - 所谓“模型工作区增强”(Navicat 17 新特性)仅优化绘图体验和协作共享,未改变底层同步逻辑
想让模型跟上库变化,唯一可靠方式是:每次改完库,立刻手动跑一次逆向工程,再把新模型发给团队。别指望自动、别依赖“同步到模型”按钮、也别幻想它能记住你上周删掉的那个字段。











