Navicat 不自动处理主键冲突,其同步逻辑完全依赖 Key Mapping 设置:若映射字段非唯一或未包含全部复合主键字段,则所有行均被误判为“不存在”而执行 INSERT,触发主键冲突;Insert/Update 记录选项需协同 Key Mapping 生效,Skip duplicate key errors 仅 Navicat 15+ 支持且仅静默跳过 INSERT 冲突。
navicat 从不自动处理主键冲突——它根本没这个逻辑,所谓“无法自动处理”其实是误解了它的设计前提:它只做差异比对和语句生成,不替你做业务决策。
Key Mapping 错了,Navicat 就压根认不出“已存在”
Navicat 判断某行在目标库“是否存在”,完全依赖你在 Step 2 的 Key Mapping 设置。如果映射字段不是主键(比如只选了 name),而 name 在目标库又不唯一,它就会把所有行都当成“不存在”,全部走 INSERT INTO,必然触发 Duplicate entry for key 'PRIMARY'。
- 复合主键必须全部字段勾选为 Key;漏一个,比对就失效
- 预览时点击某张表 → 底部切到
Difference标签页 → 查看被标为Insert的行:若id值已在目标库存在,说明 Key Mapping 错了,或两边id类型不一致(INTvsBIGINT) - Navicat 不会自动 fallback 到主键;它只按你指定的字段匹配
Insert records 和 Update records 不是开关,而是条件执行策略
这两个选项不是让你“选一种模式”,而是协同控制行为:Insert records 只对目标库没有该键的行生效,Update records 只对已有该键但字段值不同的行生效。它们共存的前提是——Navicat 先得靠 Key Mapping 正确识别出“哪些是已存在的键”。
- 两者都不勾选 → 什么都不做
- 只勾
Insert records→ 不更新已有数据,但新增时仍可能冲突(如果 Key Mapping 错) - 只勾
Update records→ 不新增任何行,哪怕源里有全新记录 - 即使全勾,只要 Key Mapping 指向非唯一字段,所有行仍会被判为“不存在”,全量 INSERT
Skip duplicate key errors 是唯一静默跳过手段,但藏得深且有版本限制
这个选项在同步向导 → Options → Error Handling 页里,作用是让 Navicat 遇到 ERROR 1062 时记 warning 并继续,但它仅在 Navicat 15+ 支持。旧版本根本没有这个开关,必须导出 SQL 后手动替换 INSERT INTO 为 INSERT IGNORE INTO 或 REPLACE INTO。
- 它只对
INSERT生效,不影响UPDATE或DELETE - 启用后日志里不会告诉你跳过了哪几条,容易漏审
- 它等效于加
IGNORE,不是让 Navicat “智能合并字段”,冲突行整条丢弃
真正容易被忽略的是:Navicat 的整个同步流程里,没有任何环节会逐字段比对并生成 merge 逻辑。它只输出标准 SQL,冲突与否、覆盖还是跳过、删再插还是静默忽略——全靠你提前在 Key Mapping、Options、SQL 选项里定死规则。一旦设错,报错不是意外,而是它如约执行了你的配置。











