Navicat本身无内置增量同步功能,需手动配置:关闭“删除目标中不存在的记录”,选“插入和更新”模式,通过“设置同步条件”添加WHERE子句(如updated_at > '2024-06-10 00:00:00'),冲突处理设为“更新现有记录”,并确保主键/唯一键、时区与字符集一致。
Navicat 本身**没有内置的“增量同步”功能**——它的导入向导(Import Wizard)本质是单次、静态的数据加载操作。所谓“CSV 增量同步到 MySQL”,实际要靠你手动控制逻辑,而不是依赖某个开关或勾选框。
下面直说怎么做、为什么这么设、哪里最容易翻车。
导入向导不支持自动识别新增行,必须靠人工约定规则
CSV 文件本身无元数据记录“哪行是新来的”。Import Wizard 每次都当作全新数据处理,除非你主动干预:
- 在 CSV 中加一列时间戳(如
updated_at),每次导出时只保留比 MySQL 表中最大时间更新的记录 - 用脚本预处理 CSV:先查 MySQL 表的主键/唯一键集合(如
SELECT id FROM orders),再过滤掉已存在的 ID 行,生成临时 CSV - 避免依赖“追加(Append)”模式就以为是增量——它只是不删旧数据,但会把 CSV 里所有行重复插入,导致主键冲突或脏数据
用 Append 模式 + IGNORE 或 REPLACE 的真实效果差异
在导入向导第 10 步「选择导入模式」里,Append 是默认项,但它和 SQL 层的 INSERT IGNORE 或 REPLACE INTO 完全不是一回事:
-
Append:直接执行INSERT INTO ... VALUES (...),遇到主键/唯一键冲突会报错并中断,错误数 > 0 - 你真正需要的“跳过重复”行为,
Navicat不提供界面选项;必须改用命令行或提前建好带ON DUPLICATE KEY UPDATE的存储过程 - 如果硬要用 GUI,唯一妥协方式是先导出当前表主键到本地,用 Excel/Python 等工具比对去重后再导入——这已经脱离“向导”范畴了
日期、空值、编码这三处不调准,导入必挂
这些参数藏在向导第 7 步「为数据源定义部分附加选项」里,极易被跳过:
-
Date order必须严格匹配 CSV 中格式:若 CSV 是25/04/2026,就得选DY(日/月/年),选成MDY会全变成0000-00-00 -
Null value字段要填明确字符串,比如 CSV 用\N表示空,这里就得输入\N,不能留空或填NULL -
Encoding必须和 CSV 实际编码一致:Windows 记事本保存的 CSV 默认是GBK,但 Navicat 新建连接默认用UTF-8,不手动改就会中文变问号或乱码
大数据量下,向导会卡死或超时,别硬扛
超过 5 万行、含长文本或二进制字段的 CSV,Import Wizard 很可能在第 11 步「开始导入」时假死,或报 MySQL server has gone away:
- 根本原因是 Navicat 把整份 CSV 加载进内存再逐行拼 SQL,没流式处理机制
- 真实可行的替代方案只有两个:
LOAD DATA INFILE(需 MySQL 开启local_infile=ON,且文件得放在服务端或客户端可信路径)或用 Python +pymysql分批executemany - 如果坚持用 Navicat,务必提前拆分 CSV:用
split -l 10000 data.csv part_(Linux/macOS)或 PowerShell 的Import-Csv+Export-Csv分块,再逐个导入
Navicat 不替你决定,也决定不了。

















