Navicat 数据同步误删目标库数据主因是默认启用“删除目标中不匹配的记录”和“截断目标表后再插入”选项,导致非预期DELETE或TRUNCATE;务必关闭这两项,并通过“预览”核验SQL,必要时添加WHERE条件限定同步范围。
Navicat 数据同步时为什么会删掉目标库数据
因为默认开启「删除目标中不匹配的记录」——这个选项不是用来“清理脏数据”的,而是为全量同步设计的。一旦源库某条记录在目标库不存在(比如你只同步了部分表、或目标库有额外测试数据),navicat 就会直接 delete 那些“多余”行。很多人没注意,点同步前只扫了一眼表名对得上,就点了执行。
高级选项里必须关掉的两个开关
打开 Navicat 的「数据同步」窗口 → 点右下角「高级」→ 重点检查以下两项:
-
删除目标中不匹配的记录:必须取消勾选(这是误删主因) -
截断目标表后再插入:如果勾选,目标表会先被TRUNCATE,整张表清空,比上面那个更危险
这两个选项哪怕只开一个,都可能让你的目标库变空。关掉后,同步行为变成「只 INSERT/UPDATE 匹配主键的行」,安全得多。
同步前用「预览」确认 SQL 而不是盲点执行
点「高级」旁边的「预览」按钮,Navicat 会生成即将执行的 SQL 语句列表。这时候你要看三件事:
- 有没有出现
DELETE FROM `xxx` WHERE ...—— 如果有,说明上面两个开关至少有一个没关 - 所有
INSERT和UPDATE是否都带了主键或唯一键条件(比如WHERE id = ?) - 是否涉及你没打算动的表(比如同步
user表时,预览里冒出了log表的语句,说明映射配置错了)
预览不是摆设,是最后一道人工校验。别跳过它。
真正保险的做法:同步前手动加 WHERE 条件
如果你只同步某段时间的数据(比如只导 4 月新增订单),光靠关闭删除选项还不够——因为同步仍会覆盖已有记录。这时要主动干预:
- 在同步设置页,点「设置字段映射」→ 找到时间字段(如
created_at)→ 点右侧「…」→ 勾选「仅同步满足条件的记录」 - 填入类似
created_at >= '2026-04-01'的条件 - 这样即使误开了删除选项,WHERE 也会拦住大部分误操作
这个细节很多人忽略,但它能把「同步变迁移」的风险压到最低。毕竟,数据库没有 Ctrl+Z,而一次误删的 bas_file 表,可能意味着几十个业务系统停摆。











