Navicat“添加记录”模式不支持跳过主键冲突,必须改用导入向导高级选项中勾选“跳过具有重复键值的记录”(仅MySQL且启用INSERT IGNORE兼容时可见),或提前清洗Excel重复数据、确保表头严格匹配字段名并留空自增列。
Navicat 导入 Excel 时选“添加记录”却报主键冲突?
不是数据没加进去,而是 navicat 默认把 excel 的第一行当字段名处理,但如果你的 excel 没有表头(或表头和目标表字段不一致),它会尝试把首行数据当作列名去匹配,导致后续所有行插入时字段错位,最终可能往 id 字段插了字符串,触发主键重复或类型错误。
实操建议:
- 确保 Excel 文件第一行是**严格对应目标表字段名**的表头(大小写、下划线、中文名都必须一致);
- 在 Navicat 导入向导第 2 步「指定导入设置」中,勾选
第一行包含列名; - 如果目标表有自增
id,Excel 中对应列**必须留空或填NULL(文本形式)**,不能填数字或任意字符串; - 若 Excel 用的是日期,列格式需设为「日期」而非「常规」,否则 Navicat 可能识别成数字(如 44562),插入后变成错误时间。
“添加记录”模式下如何跳过重复主键/唯一键数据?
Navicat 的“添加记录”本身**不提供忽略重复、替换或更新选项**——它就是直白的 INSERT INTO ... VALUES。一旦遇到 PRIMARY KEY 或 UNIQUE 冲突,直接报错中断,不会跳过。
解决路径只有两个:
- 提前在数据库侧建好
INSERT IGNORE或ON DUPLICATE KEY UPDATE的存储过程,再用 Navicat 执行 SQL 导入(不走 Excel 图形向导); - 改用「导入向导 → 高级 → 目标表设置 → 勾选
跳过具有重复键值的记录」(该选项仅在 MySQL 连接且启用了INSERT IGNORE兼容模式时可见); - 更稳妥的做法:先用 Excel 筛出待追加的 ID(或业务唯一键),查一遍目标表
WHERE id IN (...),人工剔除已存在行后再导入。
导入后发现中文乱码或字段截断?检查这三处编码
Navicat 本身不决定字符集,它依赖连接层 + 表定义 + Excel 文件实际编码三层协同。常见断点在:
诊断并修复涉及公式、命名范围、Power Query 刷新、数据透视表、VBA/宏保存等问题的 Microsoft Excel XLSX 工作簿
- Navicat 连接属性里「高级」页签中的
MySQL 字符集必须设为utf8mb4(不是utf8); - 目标表字段的 collation 应为
utf8mb4_unicode_ci或类似支持四字节 UTF-8 的排序规则; - Excel 文件若由 Windows 记事本另存为 CSV,极易保存成
GBK编码——此时必须用 Excel 2016+「另存为 → CSV UTF-8(逗号分隔)(.csv)」,或用 Notepad++ 转码后重新导入。
为什么“添加记录”有时只插了一半数据就停了?
这不是 Navicat 卡住,而是它检测到某一行某字段违反了约束(比如非空字段为空、长度超限、外键不存在),立即终止整个批次。默认不提示具体哪一行哪一列出错。
定位方法:
- 导入前在 Navicat 向导最后一步点「预览」,看是否所有字段映射正确、空值显示为
<null></null>而非空白字符串; - 把 Excel 数据量砍半测试,逐步缩小问题范围;
- 改用命令行方式导入(如
mysqlimport或LOAD DATA INFILE),错误信息更明确,例如:ERROR 1261 (01000): Row 123 doesn't contain data for all columns。
真正麻烦的从来不是“怎么点下一步”,而是 Excel 表头命名和数据库字段之间那几个下划线、空格、大小写的隐性差异——多花两分钟对齐它们,比反复重试省半小时。










