navicat导入sql server时“跳过重复记录”无效,因其无insert ignore等效语法,该选项被主动禁用;必须改用update模式并手动勾选主键为匹配条件。
navicat 导入 sql server 时主键冲突为什么“跳过重复记录”无效
因为 sql server 没有 insert ignore 或 on duplicate key update 语义,navicat 的「跳过重复记录」选项在 sql server 导入流程中实际被忽略——它只对 mysql/postgresql 生效。你看到的勾选项灰色或无响应,不是界面 bug,而是 navicat 主动禁用该开关,避免触发 jdbc 驱动级事务中断(error 2627)。
实操建议:
- 必须进入导入向导第 2 步「目标表映射」,将操作模式从
Insert明确改为Update - 手动点击主键列名右侧的「匹配」复选框(即使看起来已高亮),否则生成的
MERGE语句缺少ON条件,会变成全表覆盖 - 若目标表有多个唯一约束(如
email+phone联合唯一),Navicat 不支持多字段匹配,需提前在 SQL Server 中建视图或计算列收口逻辑
MySQL 导入时勾了 “Skip duplicate key errors” 还报错?检查 Navicat 版本和位置
这个选项仅在 Navicat 15+ 支持,且藏在同步/导入向导的「选项」→「错误处理」页里,不是主界面上的显眼开关。旧版本(如 Navicat 12)压根没有该功能,强行勾选无效;而如果你在「高级」页误点了「Continue on error」,对 MySQL 也无实际作用——它不控制 Duplicate entry 类错误。
实操建议:
- 确认 Navicat 版本 ≥ 15(菜单 → Help → About 查看)
- 导入/同步前务必点开「选项」→「错误处理」,勾选
Skip duplicate key errors - 该选项只影响
INSERT语句,对UPDATE和DELETE不生效;若日志里报的是UPDATE冲突,说明你映射错了 Key,应检查「Key Mapping」是否真用了主键或唯一索引列
Excel 导入报主键冲突,大概率是结构问题伪装成数据冲突
Navicat 解析 Excel 本质是调用 OLE DB 驱动转成结果集,遇到合并单元格、空行、表头不在第 1 行等情况,会导致字段错位——比如真实主键值被吞掉或错读成空字符串,再插进目标表时因主键为 NULL 或默认值(如 0)反复撞上已有记录。
实操建议:
- 导入前清理 Excel:取消所有合并单元格、删空行、确保表头在第 1 行;若必须从第 2 行开始,导入时手动设「起始行号 = 2」
- 导入向导第 3 步「高级」中,**必须同时勾选**
跳过错误的记录和继续导入其余记录,只开一个无效 - 预览阶段重点看「源数据预览」窗口:主键列是否出现大量
NULL、重复0或明显异常值;若有,说明解析出错,别急着执行
同步中断后重启还报 ERROR 1062?这不是数据冲突,是没断点续传
Navicat 默认无断点续传能力。中断后重启,它不会跳过已成功写入的记录,而是从头重跑,导致已插入的主键再次触发 Duplicate entry。这不是数据不一致,而是工具行为本身如此。
实操建议:
- 中断后立刻查目标库最新记录的主键值(如
SELECT MAX(id) FROM users),记下最后成功 ID - 在源库加
WHERE id > ?手动限定拉取范围,再重新同步 - 更稳妥的做法:停任务 → 在目标库
DELETE FROM users WHERE id > ?清掉可能重复的脏数据 → 再同步 - 别依赖「导出 SQL 脚本后加
INSERT IGNORE」——如果原始脚本含SET FOREIGN_KEY_CHECKS=1,得一并删掉,否则外键约束仍会拦截
关键点容易被忽略:主键冲突的根源往往不在“要不要跳过”,而在于「键映射是否真正指向主键或业务唯一列」。Navicat 的 Key Mapping 配错,比策略选错后果更严重——它会让工具彻底误判“哪些行该插入”,后续所有跳过、更新都建立在错误前提上。











