Navicat 不支持一键自动分批导入,需通过数据传输(自定义记录集/记录集生成器)、Excel 拆分(每份3–5万行、统一表头、逐个导入)或 SQL 分段脚本(每5000行一组、禁用索引/外键)实现分批;优先推荐服务端直传的「数据传输」方式。
直接说结论:navicat 本身不提供“自动分批”的导入开关,所谓“分批”,本质是人为控制每次导入的数据量,靠的是文件拆分、sql 脚本分段或数据传输的高级配置,不是点一下就出来的功能。
用「数据传输」功能分块迁移大表
这是处理百万级甚至千万级表最稳的方式,尤其适合跨库迁移(比如从 MySQL 到另一个 MySQL 实例)。
- 选中源表 → 右键「数据传输」→ 配置目标库后,务必点击右下角「高级」
- 勾选「自定义记录集」,然后手动写 WHERE 条件,例如
id BETWEEN 1 AND 100000,再新建多个任务分别覆盖不同区间 - 更省事的做法是启用「记录集生成器」:输入起始
id、步长(如 50000)、最大id,Navicat 会自动生成多个带WHERE的子任务 - 关键细节:中断后重试时,一定要取消勾选「清空目标表」和「删除目标表」,否则已导入的几十万条就没了
把 Excel 拆成多个小文件再导入
如果你的原始数据在 Excel 里,且单个文件超过 10 万行,Navicat 导入向导极可能卡死、报内存溢出或字段错位。
- 用 Python +
pandas或 Excel 自带的「另存为 → 选择行范围」功能,把一个大 Excel 拆成每份 3 万~5 万行的多个文件(命名按序号,如data_001.xlsx) - 确保所有拆分文件的表头完全一致——哪怕一个空格、大小写不同,Navicat 在批量操作时就会映射错列
- 导入时不要用「多文件同时选中」那种快捷方式,而是逐个右键表 → 「导入向导」→ 选对应文件,手动确认字段映射一次,后续可复用该映射配置
- 避免在 Excel 里留空行、合并单元格、公式,这些都会让 Navicat 解析失败,错误信息通常是
Invalid cell value或Column count mismatch
用 SQL 脚本分段执行 INSERT
适用于已有结构化数据、想绕过文件导入环节,或者需要插入过程中做简单逻辑(如生成时间戳、拼接字段)的场景。
- 别写一条含百万
VALUES的超长INSERT,MySQL 默认max_allowed_packet通常只有 4MB,很容易报错Packets larger than max_allowed_packet are not allowed - 把数据按每 5000 行一组,生成多个独立
INSERT INTO ... VALUES (...), (...), ...语句,保存为多个.sql文件 - 在 Navicat 查询编辑器中打开第一个文件 → 勾选「事务模式」→ 执行 → 成功后再开下一个,避免单次失败导致全滚
- 如果目标表有索引或外键,导入前临时禁用(
ALTER TABLE xxx DISABLE KEYS/SET FOREIGN_KEY_CHECKS = 0),导入完再启用,速度能提升 3~5 倍
最容易被忽略的一点:Navicat 的「导入向导」默认走的是客户端解析路径,它先把整个文件读进本地内存再发给数据库。所以哪怕你只导入 10 万行 Excel,只要某列包含超长文本或大量公式,实际内存占用可能翻倍。真要压测百万级,优先考虑「数据传输」+「自定义记录集」这条路,它走的是服务端直传,不经过本地内存中转。


















