“同步到数据库”功能仅将.mwb模型中的表结构变更单向生成并执行DDL语句,不比对真实库结构、不自动补全、删字段即DROP COLUMN、加非空约束须配默认值,严格按模型覆盖目标库。
“同步到数据库”功能到底同步什么
这个功能只做一件事:把你在 .mwb 模型文件里手动画出来的表结构变更,生成 ddl 语句并执行到目标数据库。它不会读取数据库当前真实结构、不会比对差异、也不会跳过已存在的字段——你模型里删了一个字段,它就真去 drop column;你加了非空约束但没给默认值,它就直接报错失败。
常见误解是以为它能“自动补全模型缺失的字段”,其实完全相反:它只按模型单向覆盖数据库。如果你刚在生产库用 ALTER TABLE 加了字段,又点这个按钮,那个字段会被干掉。
启动路径容易点错:不在模型编辑页,而在工具栏
别在双击打开的模型界面里找右键菜单或顶部“同步”按钮——那些是灰色的或根本不存在。正确入口只有这一条:
- 确保模型文件已保存(
.mwb)且 Navicat 已连接目标数据库 - 点击顶部菜单栏的
工具→同步到数据库… - 弹窗中第一步选的是「目标数据库连接」,不是模型文件本身
- 第二步才让你选「要同步哪些表」,勾选后务必核对表名是否和模型里一致(大小写、前缀、schema)
关键参数必须手动确认,否则白跑一趟
进入「选项」页后,这几个勾选直接影响执行结果:
-
生成 DROP 语句:默认勾选。如果模型里删了字段/索引,它会生成DROP;若不希望删任何东西(比如只允许新增),必须取消勾选 -
忽略主键和外键约束名:勾选后,即使模型里约束名和数据库不一致,也会尝试匹配逻辑而非名字;不勾选则可能把同义约束当成新增而重复创建 -
执行前备份目标表:强烈建议勾选。它会在执行前自动CREATE TABLE xxx_bak AS SELECT * FROM xxx,但注意:不备份视图、存储过程等其他对象
最后一步「对比」不是可选动作——它强制显示将要执行的全部 SQL,必须逐行看一遍 ALTER TABLE 是否符合预期,尤其是 MODIFY COLUMN 类型变更是否带 USING 或默认值处理。
同步失败最常卡在字段类型兼容性上
Navicat 不会帮你做类型转换。比如模型里把 varchar(50) 改成 text,MySQL 可能允许;但改成 json 就直接报错,因为旧数据无法自动转为 JSON 格式。类似情况还有:
- 从
datetime改为timestamp(时区行为不同) - 给已有数据的字段加
NOT NULL却没设DEFAULT - 修改 enum 值列表,删掉数据库里现存的某个枚举值
这类问题不会在「对比」阶段预警,只在「运行」时报错中断。所以真正上线前,先在测试库跑一次,看 信息日志 里有没有 ERROR 1832 或 ERROR 1841 这类 MySQL 特定错误码。


















