MySQL命令行导入CSV失败:158万条记录全被跳过求助
解决LOAD DATA LOCAL INFILE导入CSV无记录插入的问题
从你遇到的情况来看,核心问题是CSV字段的双引号没有被MySQL正确解析,导致数据格式不匹配表结构,触发了字段截断和主键重复警告,最终所有记录都被跳过。我来一步步帮你梳理解决:
问题根源拆解
结合你的警告信息和CSV示例数据:
- 1265字段截断:CSV里的
CodigoEst(如"7034")、ValidPP(如"S")是用双引号包裹的,但你的LOAD DATA命令没有告诉MySQL要去掉这些引号。如果表中CodigoEst是长度为4的字符串类型,带引号的"7034"是5个字符,会被强制截断;ValidPP如果是长度1的字段,"S"会被截断成",完全不符合预期。 - 1062主键重复:你的主键是
(CodigoEst, Fecha)组合,因为CodigoEst被导入成带引号的值(比如"7034"),如果表中已经存在不带引号的7034+对应日期的记录,就会触发主键重复;如果是首次导入,大概率是行分隔符解析错误导致多行被合并,或者引号处理不当导致主键值异常。
修复后的LOAD DATA命令
修改命令,添加处理双引号的配置,同时明确行分隔符(避免解析错误):
LOAD DATA LOCAL INFILE "/home/meteo/PROJECTES/BASE-AEMET/TREBALL/PCP.csv" INTO TABLE precipitacion FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' -- 关键配置:自动去掉字段两边的双引号 LINES TERMINATED BY '\n' -- 如果是Windows生成的CSV,换成'\r\n' (CodigoEst, Fecha, Precipitacion, ValidPP);
额外优化建议
- 检查表结构匹配度:
- 确认
CodigoEst的长度足够(比如设为VARCHAR(5)或更大,确保去掉引号后的值能正常存储); ValidPP字段设为VARCHAR(1)或CHAR(1),保证去掉引号后的S能完全匹配。
- 确认
- 处理重复主键场景:
如果表中已有部分数据,不想跳过重复记录,可以用ON DUPLICATE KEY UPDATE来更新对应字段:LOAD DATA LOCAL INFILE "/home/meteo/PROJECTES/BASE-AEMET/TREBALL/PCP.csv" INTO TABLE precipitacion FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (CodigoEst, Fecha, Precipitacion, ValidPP) ON DUPLICATE KEY UPDATE Precipitacion = VALUES(Precipitacion), ValidPP = VALUES(ValidPP); - 查看具体警告详情:
执行SHOW WARNINGS LIMIT 10;可以查看前10条警告的具体内容,能更精准定位潜在问题。
内容的提问来源于stack exchange,提问作者pacomet
相关产品推荐
相关产品推荐

