Navicat同步需选“追加记录”并禁用删除选项,目标表须有主键/唯一索引,配合WHERE过滤(如created_at > '2026-07-27')和“跳过错误记录”确保只插新、不覆盖、不断流。
同步时选“追加记录”而不是“删除目标表”
navicat 数据同步默认不保留目标库原有数据,除非你明确选择「追加记录」模式。如果勾选了「删除目标中的同名表」或「清空目标表」,目标库数据会被直接覆盖或清空——哪怕只同步一张表,其他字段或行也不会被保留。
正确做法是在「选项」页中找到「冲突处理」设置,然后:
- ✅ 勾选「追加记录」
- ❌ 不勾选「删除目标中的同名表」
- ❌ 不勾选「清空目标表」(该选项在部分版本中叫“truncate before insert”)
- ⚠️ 注意:「追加记录」仅对主键/唯一键不冲突的行生效;若源数据含重复主键,会因数据库约束报错并跳过(取决于是否启用「跳过错误记录」)
目标表必须已有结构,且字段顺序、类型、约束需一致
「追加记录」模式不会自动建表或改结构。如果目标表不存在,同步会失败;如果存在但字段少、类型错(比如源是 JSON,目标是 VARCHAR),插入时可能截断、报错或静默丢数据。
务必提前确认:
- 目标表已存在,且 DESCRIBE table_name(MySQL)或 \d table_name(PostgreSQL)显示字段名、顺序、类型、NULL/NOT NULL 约束与源完全一致
- 主键或唯一索引定义相同,否则无法判断“是否重复”,追加逻辑失效
- 字符集和排序规则(collation)一致,尤其含中文、emoji 时,否则可能触发隐式转换失败
WHERE 条件过滤源数据,避免误增冗余行
「追加记录」本身不带去重或更新逻辑,它只是把源里满足条件的数据 INSERT IGNORE 或 INSERT … ON CONFLICT DO NOTHING(取决于数据库能力)。如果你只想补漏、不希望重复插入,得靠源头控制。
在「高级」设置中配置 WHERE 子句,例如:
- 只同步今天新增的订单:created_at > '2026-07-27'
- 排除测试数据:env != 'test'
- 按状态筛选:status IN ('paid', 'shipped')
⚠️ 注意:WHERE 是在源库执行的,所以字段名、函数必须兼容源库语法(如 MySQL 的 NOW(),PostgreSQL 的 NOW() 或 CURRENT_DATE)
主键冲突时用「跳过错误记录」保流程不断,但要查日志
即使开了「追加记录」,只要源数据里有主键/唯一键已存在于目标表的行,数据库就会报错(如 MySQL 的 Duplicate entry,PostgreSQL 的 duplicate key value violates unique constraint)。此时同步会中断,除非你主动处理。
建议组合使用:
- ✅ 勾选「跳过错误记录」
- ✅ 同步完成后立即打开 Navicat 底部「日志」面板,搜索 Duplicate 或 unique constraint
- ✅ 对报错的主键值,手动检查源目标是否真需覆盖,还是该走 UPDATE 而非 INSERT
⚠️ 「跳过错误记录」不会告诉你跳了多少条,也不会生成明细报告,只能靠日志关键词人工核对
追加模式下最易被忽略的是字段兼容性——比如源表加了新列但目标表没同步结构,那一列数据就彻底丢失,而 Navicat 不报错也不警告,只会静默忽略该字段值。


















