同步前必须确认三件事:一是模型中是否存在目标库未有的表,否则可能因同名对象报错;二是目标库是否有模型未定义的字段或索引,勾选“删除不存在的对象”会导致其被清除;三是外键约束是否启用,若FOREIGN_KEY_CHECKS=0将跳过校验引发后续错误。
同步前必须确认的三件事
navicat data modeler 的「同步模型到数据库」不是一键覆盖,而是生成并执行 ddl 脚本。如果跳过验证直接运行,极大概率导致表被删、字段丢失或外键失效。
务必检查以下三点:
-
模型中是否包含未在目标库中存在的表?—— 同步会尝试创建,但若目标库有同名视图/临时表会报错ERROR 1050 (42S01): Table 'xxx' already exists -
目标库中是否有模型里没定义的字段或索引?—— 默认设置下,这些对象不会被自动删除,但若勾选了「删除不存在的对象」,就真没了 -
外键约束是否启用?—— 若目标库FOREIGN_KEY_CHECKS=0,同步时可能跳过外键校验,后续插入数据时报错
执行同步时的关键参数选择
点击菜单栏 文件 → 同步到数据库 后,向导第二步「比对选项」里,这几个勾选项直接影响结果:
-
忽略大小写差异:MySQL 默认不区分,但 PostgreSQL 区分;若模型用小写字段名而目标库是大写,不勾选会导致误判为「新增字段」 -
比较列顺序:勾选后,即使两表字段完全相同但顺序不同,也会生成ALTER TABLE ... MODIFY COLUMN语句重排——这在大数据表上可能锁表数分钟 -
同步注释:模型里的字段备注(Comment)默认不同步,必须手动勾选,否则COMMENT ON COLUMN不会生成 -
仅生成脚本(不执行):强烈建议首次同步时勾选,先保存脚本人工 review,尤其检查DROP INDEX或CHANGE COLUMN类高危操作
常见失败场景与对应解法
同步中途中断或报错后,模型和数据库状态可能不一致,不能直接重试。
-
ERROR 1022 (HY000): Can't write; duplicate key in table 'xxx':通常是模型里主键/唯一约束重复定义,或目标库已有数据违反新约束。先用SELECT * FROM xxx WHERE ...查冲突数据,再决定是清理数据还是调整模型 -
ERROR 1060 (42S21): Duplicate column name 'xxx':模型中某张表字段名重复(比如两个id),Data Modeler 界面可能不报错,但同步时崩溃。需在模型编辑器里逐个表检查字段列表 - 同步后外键没生效:检查目标库是否启用了 InnoDB 引擎(
SHOW CREATE TABLE xxx看 ENGINE=InnoDB),MyISAM 不支持外键;另外确认模型中外键连线是否真正拖拽到了目标字段上(松手时有绿色高亮才有效)
增量变更时别跳过「比对」步骤
很多人改完模型就直接点同步,结果把昨天刚加的字段又删了。Data Modeler 不会记住你上次同步了什么——它每次都是拿当前模型和当前数据库做全量比对。
所以真实工作流应该是:
- 在模型里修改表结构(增字段、调类型、加索引)
- 点
同步到数据库→ 进入向导 → 第二步点比对按钮主动触发比对 - 在「差异列表」里确认只有你预期的变更(比如只显示
ADD COLUMN created_at),没有意外的DROP COLUMN updated_at - 再点下一步生成并执行
这个比对动作本身不产生任何变更,但它是防止误操作的唯一闸门。漏掉这步,等于蒙眼开车。


















