navicat同步报duplicate entry错误的根本原因是key mapping未正确指向主键或唯一索引字段,导致navicat误判所有行为“不存在”而反复insert;必须在step 2中严格勾选id/order_no等唯一字段,确保大小写与目标表一致,并验证表已建primary key或unique索引。
navicat 同步时出现重复主键报错(duplicate entry '123' for key 'primary'),不是配置没点对,而是它明确告诉你:源和目标两边都存了同一主键的记录,且你没告诉它“撞上了该怎么选”。
同步前必须确认 Key Mapping 是否指向主键或唯一索引
Navicat 判断“是否重复”,完全依赖你在 Step 2「Key Mapping」里勾选的字段。如果这里选的是 name 或 created_at 这类非唯一字段,它就会把所有行都当成“不存在”,然后反复 INSERT,必然触发主键冲突。
- 进同步向导 Step 2 → 点开每张表的「Key Mapping」→ 只勾选真正能唯一标识一行的列(如
id、order_no、email) - 复合主键必须全部勾选,缺一个就失效
- 字段名大小写、下划线、空格要和目标表完全一致(
user_id≠USER_ID) - 用
SHOW CREATE TABLE table_name验证目标表确实建了PRIMARY KEY或UNIQUE索引
Insert records 和 Update records 不是二选一,而是协同生效
这两个选项控制 Navicat 对“同键不同值”的行为,但它们不互斥——同时勾选才是增量同步的常见组合。
-
Insert records:只对目标库**没有**该主键/唯一键的行执行INSERT -
Update records:只对目标库**已有**该主键/唯一键、但其他字段值不同的行执行UPDATE - 都不勾选 → 什么都不做;只勾
Insert records→ 不更新已有数据;只勾Update records→ 不新增任何行 - 如果只想新增不覆盖(比如日志表),必须同时确保「冲突处理」设为「跳过」,否则遇到已存在主键仍会中断
「跳过重复记录」在 MySQL 和 SQL Server 中表现完全不同
这个选项不是通用开关,底层能力由数据库决定,不能跨库套用。
- MySQL 下启用「忽略重复项」(字段映射页右下角勾选)→ 实际生成
INSERT IGNORE,仅跳过ERROR 1062类主键/唯一键冲突 - SQL Server 完全不支持该语义,勾选无效,报
Error 2627;唯一可靠方式是改用「Update」模式 + 手动激活主键列右侧的「匹配」复选框 - CSV/TXT 导入里的「跳过错误」≠「跳过重复」:它只处理类型不匹配、空值插
NOT NULL等格式错误,对主键冲突完全无感
别跳过预览,先看 Conflict 行具体差在哪
直接开「Skip duplicate key errors」看似省事,实则掩盖问题。真正稳的做法是关掉它,点「Compare & Preview」,在差异界面直接定位冲突行。
- 预览时点击某张表 → 底部切到「Difference」标签页 → 查看被标为
Insert的行是否本该是Update - 右键某条冲突记录 → 取消勾选,临时跳过;批量处理建议导出 SQL 后手动删减或加
REPLACE INTO - 注意:
REPLACE INTO是先DELETE再INSERT,可能丢失自增 ID 或触发ON DELETE逻辑,慎用 - 时间字段过滤要用静态字符串(如
'2026-07-20 00:00:00'),NOW()在 GUI 里不生效
最常被忽略的一点:Navicat 本身不判断业务逻辑,它只认你指定的 Key 字段和你勾选的动作。所谓“重复”,本质是你没对齐主键定义、没说清以谁为准、也没限定同步范围——这三个点没理清,调再多选项也压不住报错。











