Navicat模型与数据库无自动同步机制,必须显式执行“工具→同步到数据库…”:需已保存.mwb文件、建立含CREATE/ALTER权限的有效连接,且模型DBMS版本须与目标库一致,否则类型映射失准、SQL执行报错。

“模型改了,数据库没变”不是同步失败,是根本没启动同步
Navicat 的模型(.mwb 文件)和数据库之间没有后台监听、不自动感知变更、也不缓存差异。你双击字段改了类型、点了保存模型文件,那只影响本地文件——目标库完全不知情。所谓“同步”,必须显式走 工具 → 同步到数据库… 这条路径,且每一步都不可跳过。
常见错误现象:
- 右键模型空白处或表名,找不到“同步到数据库”菜单 —— 因为入口不在右键,只在顶部
工具菜单 - 点了菜单但弹窗里目标连接为空或灰色 —— 当前无有效活动连接,或该连接权限不含
ALTER/CREATE - 点“开始”后卡在“对比”页不动 —— 模型中用了保留字(如
order、group)导致元数据读取失败
字段类型改了,但同步时生成的 SQL 报错或被跳过
Navicat 不会智能适配版本兼容性,也不会帮你兜底类型转换风险。比如你在模型里把一个 VARCHAR(50) 改成 JSON,但目标库是 MySQL 5.6,同步脚本一执行就报 ERROR 1064,而界面可能只显示“部署失败”,不提示具体原因。
关键控制点:
- 模型属性里设置的 DBMS 类型和版本(如 MySQL 8.0)必须与实际目标库一致,否则类型映射直接失准
-
DATETIME字段若带精度(如DATETIME(3)),必须双击字段 → Physical Type 手动选,并勾选「启用精度」;仅改逻辑类型无效 - 从
VARCHAR改为ENUM或SET时,模型中必须填完整枚举值列表,否则导出 SQL 缺少ENUM('a','b')定义,执行报错 - 模型里删字段 ≠ 同步时安全删除:若目标库该字段有存量数据或被视图/触发器引用,
DROP COLUMN会失败,且 Navicat 默认不中断后续操作
为什么“设计表”里改字段类型能生效,模型却不行?
这是两个完全独立的操作通道:设计表 是直连数据库执行 DDL(如 ALTER TABLE ... MODIFY COLUMN),当场生效;而模型是离线设计文档,它不发任何语句,也不读取当前库结构。两者之间没有双向绑定,也没有状态同步机制。
容易混淆的点:
- 你在
设计表中改了字段类型并点保存 → 实际执行了一条ALTER TABLE,只影响当前连接的库 - 你在模型中做了同样修改 → 仅更新
.mwb文件,对任何数据库零影响 - 模型和
设计表字段类型不一致时,Navicat 不警告、不校验、不自动对齐 - 模型转数据库时,Navicat 默认按模型定义覆盖,不会合并已有字段的注释、索引、外键等附加属性
同步前必须人工确认的三件事
缺一不可,漏掉任一环节,“改了也白改”:
-
目标库用户权限:必须含ALTER、CREATE、DROP;仅SELECT+INSERT会导致部署卡在“正在运行”却不报错 -
MySQL 版本兼容性:模型设了JSON,目标库是 5.7?模型用CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP给DATETIME,目标库是 5.6?这些都不提前校验 -
目标表是否已被手动修改:DBA 上周给这张表加了唯一索引,但模型里没画,同步时这个索引会被删——Navicat 不比对现有索引,只按模型“重建”
最常被忽略的是:同步不是“一键推送到库”,而是“先比对生成 DDL,再执行”。中间那步“生成”是快照式的,依赖你点击“比对”那一刻的模型状态和目标库元数据;之前改过的模型,如果不重新打开向导、不点比对,就不会进 pipeline。











