「仅插入」同步会跳过主键/唯一键冲突的记录,适合纯新增场景,但需确保主键一致、配置冲突处理为“跳过”,并配合WHERE过滤条件实现真正增量同步。
Navicat 同步类型选「仅插入」会跳过所有已存在主键的记录
选「仅插入」后,navicat 会在目标表执行 insert ignore 或类似逻辑,遇到主键/唯一键冲突(如 id = 123 已存在)就直接跳过,既不报错也不更新。这适合纯新增场景,比如日志表、订单流水表等业务上禁止修改的历史数据。
但要注意:仅插入 不等于“安全增量”——如果源表有更新(比如 status 字段变了),这些变更会被完全忽略;而且一旦目标表缺失主键或唯一索引,Navicat 无法判断是否“已存在”,可能报 Duplicate entry 错误中断,或静默失败。
- 必须确保源表和目标表的主键或唯一索引字段名、类型、值完全一致,否则 Navicat 匹配不到行,INSERT 会重复触发
- 目标表不能有
NOT NULL字段缺失默认值,否则即使主键不冲突,INSERT 也会因字段为空失败 - 如果源表用 UUID 当主键,而目标表是自增 ID,
仅插入会失效——Navicat 根本找不到匹配依据
「仅插入」必须配合 WHERE 过滤条件,否则仍是全量扫描
Navicat 默认对整张表做主键比对,哪怕你选了「仅插入」,它还是会把源表所有行拉出来逐个检查是否在目标表存在。没加 WHERE 条件,就是全表扫描+全表比对,耗时长还容易锁表。
真正控制“只拉新增”的,是你在「同步设置 → 表映射 → 过滤条件」里填的语句,比如:created_at > '2026-04-20 00:00:00' 或 id > 98765。这个条件在同步前就过滤源数据,Navicat 只拿符合条件的行去比对。
- 时间字段推荐用带秒的格式:
'2026-04-20 12:34:56',避免跨分钟漏掉边界数据 - 别写
NOW()或DATE_SUB(NOW(), INTERVAL 1 DAY)—— GUI 不支持运行时函数,只认静态字符串 - 如果用
id做锚点,要确认它单调递增且不被归档/重用,否则id > 98765会跳过中间补录的数据
「仅插入」下如何避免主键冲突导致同步中断
常见错误是同步中途报 Duplicate entry '123' for key 'PRIMARY' 然后停住。这不是 Navicat bug,而是它发现某条记录在目标表已存在,但又没配置好冲突处理策略。
解决方式不是关报错,而是提前告诉 Navicat:“遇到重复主键,跳过就行”。这需要进「高级选项 → 冲突处理」,明确选「跳过」而非默认的「停止」。
- 勾选「跳过」后,Navicat 对每条冲突记录只打一行日志(在信息日志页可见),继续处理下一条
- 别指望「跳过」能自动更新时间戳字段——它真就只跳过,连
created_at都不会刷成当前时间 - 如果目标表有触发器(比如插入时自动设
updated_at),「仅插入」不会触发它,因为根本没走 INSERT 流程
为什么「仅插入」不适合大多数更新型业务表
如果你的表允许编辑(比如用户资料、商品价格、订单状态),选「仅插入」会让目标库长期落后于源库。例如源端把 order_id=456 的 status 改成 'shipped',目标端永远还是 'pending'。
此时该换「插入和更新」,并确保:源表有可靠 updated_at 字段 + 目标表主键/唯一索引完整 + 「冲突处理」设为「更新现有记录」。否则你自以为在做增量,实际只是在反复插入同一堆旧数据。
最常被忽略的一点:Navicat 不会记住上次用的 updated_at > '2026-04-20',每次同步都得手动改时间值——没这步,就等于没增量。











