navicat数据同步报duplicate entry错误,说明实际执行的是insert操作而非结构同步;需检查options页是否误勾synchronize data、预览sql是否含insert语句,并确认key mapping准确匹配主键或唯一索引。
navicat 数据同步报 duplicate entry 错误,不是结构问题,而是它正在执行 insert 操作——你当前走的是「数据同步」流程,不是「结构同步」。
为什么点“同步模型”却报主键冲突?
Navicat 的「结构同步(Structure Synchronization)」只生成 ALTER TABLE、CREATE INDEX 等 DDL 语句,绝不会出现 Duplicate entry。只要你看到这个错误,说明实际触发的是数据写入逻辑:
- 你在同步向导 Step 1 的「Options」页误勾了
Synchronize data - 或者你根本没进结构同步,而是点了【Tools】→【Data Synchronization】——这入口默认就是数据同步
- 预览 SQL 里只要出现
INSERT INTO,就坐实了是数据操作,不是改表结构
同步前必须核对 Key Mapping
Navicat 判断“某行在目标库是否存在”,完全依赖你在 Step 2 「Key Mapping」中选的字段。如果这里没选对主键或唯一索引列,它就会把本该 UPDATE 的行当成新行去 INSERT,直接撞上主键约束:
- 务必确认映射的字段确实是目标表的主键(如
id),不能只靠自动匹配 - 复合主键必须全部字段勾选为 Key,缺一个就退化成全量插入
- 检查源/目标表对应字段类型是否一致:一边是
INT、另一边是BIGINT,可能导致比对失效 - 预览界面点击某张表 → 底部切到「Difference」标签页 → 查看被标为
Insert的行;如果这些行在目标库明明已有id,说明 Key Mapping 错了
跳过冲突的三种实操路径
图形界面没有全局“出错继续”开关,所谓「高级设置中勾选发生错误时继续」只存在于导入向导(Import Wizard),对主键冲突完全无效。真正可控的做法只有这三种:
- 临时跳过单行:在「Compare & Preview」界面右键某条冲突记录 → 取消勾选,适合少量异常数据
-
静默忽略重复:在同步向导 → 「Options」→ 「Error Handling」页勾选
Skip duplicate key errors;等效于生成INSERT IGNORE,但会掩盖真实数据差异,不建议用于生产环境 -
导出后手动加固:最后一步选「Save as SQL File」→ 打开生成的
.sql→ 全局替换INSERT INTO `table_name`为INSERT IGNORE INTO `table_name`或INSERT INTO `table_name` (...) VALUES (...) ON DUPLICATE KEY UPDATE col1 = VALUES(col1)
容易被忽略的底层细节
很多冲突其实源于更隐蔽的配置偏差:
- 目标表的
id是AUTO_INCREMENT,但源数据导出时带了具体值(比如用 Navicat 数据传输导出 SQL 没勾「导出 AUTO_INCREMENT 值」),导致同步时硬插已存在 ID - 连接参数未统一时区,
TIMESTAMP字段在转换中变成NULL,触发NOT NULL约束失败,间接表现为插入失败并卡住后续流程 - 表名或字段名是 MySQL 保留字(如
order、group),结构同步时若没开Auto-escape keywords,生成的CREATE TABLE order会先报语法错误,导致后续数据同步根本无法启动











