Navicat无冲突规则引擎,需手动选容错策略:Navicat 15+ 同步向导中Options→Error Handling勾选Skip duplicate key errors可静默跳过主键/唯一键INSERT冲突,旧版本须导出SQL将INSERT INTO替换为INSERT IGNORE或REPLACE INTO。

Navicat 本身没有“冲突规则引擎”,所谓自动化处理冲突,本质是提前选好容错策略 + 控制执行粒度,而不是让工具自动判断哪条数据该留、哪条该丢。
同步前必须启用 Skip duplicate key errors(仅 Navicat 15+)
这是唯一能在运行时静默跳过 Duplicate entry for key 'PRIMARY' 或 for key 'uk_email' 的内置开关,但它藏得深:
- 进入数据同步向导 → 点左下角
Options→ 切到Error Handling标签页 - 勾选
Skip duplicate key errors(旧版本如 Navicat 12/14 没这项,必须导出 SQL 手动改) - 它只对
INSERT生效;UPDATE和DELETE冲突仍会报错中断 - 日志里只记 warning,不列具体跳过了哪些主键值,容易漏审——别全信它
导出 SQL 后手动替换 INSERT INTO 是更可控的做法
跳过不是目的,搞清“为什么重复”才是关键。直接启用跳过开关会掩盖数据不一致问题:
- 同步向导最后一步勾选
Generate synchronization SQL script,保存为sync_20261021.sql - 用编辑器打开,全局替换
INSERT INTO `table_name`→INSERT IGNORE INTO `table_name` - 若需覆盖逻辑(删旧插新),改用
REPLACE INTO,但注意:REPLACE会触发ON DELETE行为,且重置自增 ID 和时间戳字段 - 别双击运行生成的 SQL,用命令行执行:
mysql -u user -p -v db_name ,加-v可看到每条语句是否被忽略
Key Mapping 配错会导致“假冲突”,比跳过更危险
很多报错看着像冲突,其实是 Navicat 根本没比对上已有记录,全当新行插入:
- 进同步向导 Step 2 →
Key Mapping页面,确认每张表用于匹配的字段是主键(如id)或业务唯一键(如order_no) - 复合唯一索引(如
(user_id, action_type))必须全部字段同时勾选,漏一个就失效 - 预览时点开某张表 → 底部切到
Difference标签页 → 查看标为Insert的行,用其 key 值反查目标库:若该值已存在,说明 Key Mapping 没配对 - 注意字段类型隐式不一致:源是
BIGINT,目标是INT,可能导致高位截断后“看似不同实则相同”
真正难的从来不是怎么跳过冲突,而是怎么让 Navicat 正确识别“同一行”。一旦 Key Mapping 或字段类型对不上,所有跳过策略都只是把错误延迟暴露而已。











