应删除CSV中主键列或选用“CSV using LOAD DATA”格式并勾选“Ignore duplicate rows”;若需更新而非忽略,则改用INSERT ... ON DUPLICATE KEY UPDATE语句,并导入后调整AUTO_INCREMENT值。
导入CSV报错 Duplicate entry for key 'PRIMARY' 怎么办
phpmyadmin 本身不跳过重复主键,遇到第一个冲突就停——不是你文件有问题,是它默认行为就是「错即停」。报错里那个 duplicate entry '123' for key 'primary' 就是信号,说明 csv 里带了已有 id 值,而目标表没做适配。
先确认是不是真要保留 CSV 里的主键值
很多情况下,你根本不需要 CSV 里的 id 字段:比如补数据、迁移测试库、或目标表本就用自增。这时候强行保留反而引发冲突。
- 打开 CSV 用 VS Code 或 Notepad++ 看第一列是不是纯数字
id,且和目标表当前最大id重叠 - 执行
SELECT MAX(id) FROM table_name查当前最大值,对比 CSV 里最小的id - 如果 CSV 的
id是旧系统遗留、且业务上不要求连续或复用,直接删掉这列最省事
删不了主键列?那就改导入方式
phpMyAdmin 不支持运行时加 INSERT IGNORE,但你可以绕过:用「CSV using LOAD DATA」格式,它底层走的是 MySQL 的 LOAD DATA INFILE,支持 IGNORE 关键字。
从 CSV 数据集生成图数据库加载器和三元组映射。将表格 CSV 数据转换为图数据库可直接使用的节点、边和三元组。
- 上传 CSV 时,格式选
CSV using LOAD DATA(不是默认的「CSV」) - 勾选
Do not use NULL value和First line contains column names - 在「Additional options」里找到
Ignore duplicate rows并勾选(部分版本叫IGNORE或显示为复选框) - 如果没这个选项,说明 phpMyAdmin 版本较老,得手动在服务器端执行:
LOAD DATA INFILE '/var/lib/mysql-files/data.csv' IGNORE INTO TABLE tbl_name;
必须保留原主键且要更新其他字段?别用 IGNORE
INSERT IGNORE 会静默丢掉整行,连时间戳、状态这些关键字段都不碰——如果你需要「存在则更新」,就得换方案。
- 导出 CSV 后,用 Python 或 sed 转成 SQL:每行生成类似
INSERT INTO t (id, name, updated_at) VALUES (123, 'Alice', NOW()) ON DUPLICATE KEY UPDATE updated_at = VALUES(updated_at); - 确保目标表主键或唯一索引已建好,否则
ON DUPLICATE KEY UPDATE不生效 - 避免用
REPLACE INTO:它本质是删+插,会重置自增 ID、触发 DELETE 相关逻辑,外键和触发器行为不可控
最容易被忽略的是:CSV 里带主键值 + 目标表 AUTO_INCREMENT 没调大,即使用了 IGNORE,后续新插入仍可能撞上 CSV 里最大的那个 id。导入完务必执行 ALTER TABLE table_name AUTO_INCREMENT = N;,其中 N 至少比 SELECT MAX(id) 结果大 1。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










