navicat导入excel时主键列必须设为“忽略”:在字段映射页将自增主键(如id)对应源字段选为“忽略”,而非留空或选择excel中的id列,否则空值会被转为0导致主键冲突或插入失败;同时目标表必须正确定义auto_increment属性。

Navicat导入Excel时主键列必须设为“忽略”
Navicat不会自动跳过自增主键列——哪怕你Excel里留空了id列,它也会把空单元格解释成0并插入,触发MySQL的0值写入逻辑,导致自增失效或主键冲突。
关键操作在「字段映射」步骤:导入向导走到「选择目标字段对应关系」页面后,找到数据库表中的自增主键字段(如id),把它对应的源字段下拉菜单改为忽略。不是留空,不是选id列,是明确点选忽略。
- 如果误将Excel里的
id列映射过去,即使该列全为空,Navicat仍会批量插入0 - 若目标表已存在数据,且MySQL启用了
sql_mode=NO_AUTO_VALUE_ON_ZERO,插入0会直接报错Incorrect integer value: '0' for column 'id' - 勾选
忽略后,Navicat生成的INSERT语句中将完全不包含id字段,交由MySQL按AUTO_INCREMENT规则生成
导入前务必确认表结构已启用AUTO_INCREMENT
仅靠Navicat设置“忽略”不够——目标表本身必须正确定义了自增主键。否则就算跳过了字段,MySQL也没法生成ID。
用DESCRIBE table_name;检查输出中extra列是否为auto_increment。常见错误包括:
- 建表时只写了
PRIMARY KEY但漏了AUTO_INCREMENT,例如:id INT PRIMARY KEY→ 错误 - 主键类型是
VARCHAR或UUID,这类字段天然不支持AUTO_INCREMENT - 字段允许
NULL,而AUTO_INCREMENT要求主键列NOT NULL
修复命令示例:ALTER TABLE user_info MODIFY id INT NOT NULL AUTO_INCREMENT FIRST;
不要依赖“删旧导新”模式来绕过主键问题
有资料建议选「删除目标全部记录并重新导入」来规避主键冲突,这属于掩耳盗铃——它不解决根本问题,反而带来风险:
- 误操作会清空线上表,不可逆
- 即使清空了,若字段映射没设
忽略,新导入的数据依然全是0,下次插入就爆唯一键冲突 - 外键约束、触发器、权限等周边配置可能被意外破坏
真正安全的做法只有两个:① 表结构正确 + ② 导入时主键列设忽略。其他都是临时补丁。
Excel文件本身无需准备ID列
最省事的方式是:导出模板时就不带id列;录入数据时也完全不填这一列。这样在Navicat字段映射页,id甚至不会出现在源字段列表里,自然无法误映射。
如果你拿到的Excel里已有id列(比如从其他系统导出),别手动删列——直接在Navicat映射页设忽略更可靠。手动删列容易误删其他内容,且不同Sheet命名不一致时易出错。
另外注意:Excel里用空字符串""、文字"null"或数字0填充id列,都会被Navicat识别为显式值,必须统一设为忽略。











