navicat结构同步默认不删数据,但勾选“drop target objects first”会先drop/truncate导致数据全失;alter模式下缩小字段长度或删列仍会截断或丢失数据,务必预览sql并人工审查。
navicat 的结构同步(structure synchronization)默认不会删除表中已有数据,但可能间接导致数据丢失——关键取决于你选择的同步模式、目标对象是否存在,以及是否勾选了「删除目标中不存在的对象」这类危险选项。
同步时勾选了「Drop target objects first」会清空数据
这个选项出现在同步预览页底部,文字通常是 Drop target objects first 或类似表述(不同版本略有差异)。一旦勾选,Navicat 会在执行 DDL 前先执行 DROP TABLE 或 TRUNCATE,直接清空目标表甚至整个表结构。
- 常见触发场景:目标库中表名相同但结构不一致,你又想“彻底重来”
- 实际效果:相当于先删表再重建,所有数据立即丢失
- 风险提示:该选项默认不勾选,但容易被手动误点,且没有二次确认弹窗
ALTER 模式下通常安全,但字段变更仍可能隐性丢数据
如果没勾选 Drop target objects first,Navicat 默认走 ALTER TABLE 路径同步字段增删改。这时多数操作是安全的,但以下情况仍会丢数据:
- 将
NOT NULL字段改为允许NULL:安全 - 将允许
NULL改为NOT NULL:若存在空值,同步失败(报错),不会自动清理 - 缩小字段长度(如
VARCHAR(255)→VARCHAR(50)):超出长度的值会被截断,且 Navicat 不提示、不报错(MySQL 严格模式关闭时) - 删除字段:该列所有数据直接消失,不可逆
外键、索引、注释等对象同步需单独确认
Navicat 同步界面右上角有「Options」按钮,点开后能看到多个开关:
-
Synchronize indexes:勾选后会删掉目标库中源库没有的索引(不删数据,但可能影响查询性能) -
Synchronize foreign keys:同理,可能删/重建外键约束 -
Synchronize comments:只影响表/字段注释,无数据风险 -
Compare options → Ignore column order:建议勾选,否则字段顺序不同也会触发 ALTER(虽不丢数据,但生成冗余语句)
这些选项本身不删数据,但若和 Drop target objects first 组合使用,就会放大破坏力。
真正保险的做法:导出 SQL 预览 + 手动审查
Navicat 在点击「Next」进入预览页后,会显示将要执行的全部 SQL 语句。这是唯一能提前发现风险的环节:
- 逐条检查是否含
DROP TABLE、TRUNCATE、MODIFY COLUMN等高危操作 - 注意是否有
ALTER TABLE ... DROP COLUMN—— 这类语句在预览里很显眼 - 如果看到
CREATE TABLE ... SELECT类重建语句,说明 Navicat 内部选择了“重建表”策略(常见于 MySQL 5.7+ 的在线 DDL 限制),此时即使没勾选 Drop,也可能临时锁表并重建,有小概率失败回滚不完全
生产环境务必把预览 SQL 复制出来,在测试库跑一遍,或用 pt-online-schema-change 等工具替代。
最常被忽略的一点:Navicat 的同步逻辑依赖数据库自身的元信息比对,而某些字段类型(如 TINYINT(1) 和布尔映射)、字符集声明(utf8mb4_unicode_ci vs utf8mb4_0900_as_cs)可能被判定为“不一致”,从而触发不必要的 ALTER —— 表面看是结构同步,实际悄悄改了排序规则或默认值。











