Navicat 17“同步到数据库”是DROP+CREATE全量覆盖,非无损更新;它不比对字段差异、不保留数据、不校验兼容性,仅适用于全新环境初始化,生产环境必须改用人工比对ALTER语句或结构同步。
“同步到数据库”不是更新,是 drop + create 全量覆盖——模型画完想落地建表?别点同步到数据库。它不会比对字段增删改,而是暴力清空目标库所有参与表、再重建。哪怕你只调了一个 varchar(255) 到 varchar(500),原有数据也会全丢。
同步前必须确认:这是你要的“重建”,不是“迁移”
Navicat 的 同步到数据库 功能本质是代码生成器 + 执行器:它把模型当前状态转成一套完整 DROP TABLE + CREATE TABLE SQL,然后一股脑执行。不保留数据、不判断兼容性、不跳过已存在对象。
- 适用场景:本地开发库初始化、全新环境部署、模型与库完全脱节需强制对齐
- 不适用场景:生产库、已有业务数据的测试库、仅修改个别字段或索引
- 没有“预览差异”按钮——它不比较,只生成
同步操作路径和关键弹窗选项
右键模型 → 同步到数据库 → 弹窗中必须手动勾选两项:
-
删除不存在于模型中的表:默认勾选,意味着你删掉模型里的某张表,同步时会DROP对应库表 -
删除不存在于模型中的列:默认不勾选,但一旦勾选,模型里没写的字段会被ALTER TABLE ... DROP COLUMN
⚠️ 注意:删除不存在于模型中的索引 和 外键 选项也存在,但它们依赖模型是否显式定义了这些对象——Navicat 不从数据库反查现有索引,只按模型内容决定删不删。
为什么改个字段长度就丢数据?因为没走 ALTER
Navicat 同步逻辑不生成 ALTER TABLE ... MODIFY COLUMN,而是直接重建整张表。原因很实际:
- 跨数据库兼容性差(MySQL 的
MODIFYvs PostgreSQL 的ALTER COLUMN TYPE) - 字段重命名、主键变更、NOT NULL 约束增减等操作,在
ALTER中易出错,重建更可控 - 模型层不记录“历史状态”,无法推导出最小变更集
所以如果你需要保留数据,唯一安全做法是:导出模型为 SQL 文件 → 手动编辑成 ALTER 语句 → 在数据库客户端里执行。
替代方案:用“导出 SQL”+人工比对
真正可控的落地方式是绕开 同步到数据库:
- 模型 → 右键 →
导出 SQL→ 保存为.sql文件 - 用
mysqldiff或pt-online-schema-change(MySQL)比对该 SQL 与线上库结构 - 或用 Navicat 自带的
数据库 → 数据库同步功能(注意:这不是模型同步,是库对库结构比对)
模型同步功能适合“从零建模→建库”的线性流程;一旦库已有数据,它就不再是辅助工具,而是风险开关。


















