【问题标题】:LOAD DATA INFILE is skipping ALL rows and no warningsLOAD DATA INFILE 正在跳过所有行并且没有警告
【发布时间】:2014-02-03 18:28:49
【问题描述】:

我寻找了一个类似的问题,但我找不到一个神奇的答案......所以我希望我现在能找到一个,因为这让我发疯!

我在将 CSV 数据导入 MySQL 方面做得很好...现在突然间我什么也没有得到,只是跳过了记录。我应该提到我一直在做很多删除记录(只是在我学习 MySQL 和构建我的第一个数据库时进行真正的试验)所以我一直在剪切和更改数据,包括在 Excel 中进行大量复制/粘贴,只是以防万一这可能导致麻烦。

这里是一个示例,我将 CSV 缩减为仅 2 条记录:

GENRE_NAME
Classic Rock
Electronica

加载数据的查询:

LOAD DATA INFILE 'Music_All_2.csv' IGNORE INTO TABLE genres COLUMNS TERMINATED BY ',' ESCAPED BY '\\' LINES TERMINATED BY '\r' IGNORE 1 LINES (genre_name);
Query OK, 0 rows affected (0.00 sec)
Records: 2  Deleted: 0  Skipped: 2  Warnings: 0

并且该表是空的(因此由于它们已经存在,因此不会跳过它们):

select * from genres;
Empty set (0.00 sec)

最后,这是SHOW CREATE TABLE genres 的输出:

genres | CREATE TABLE `genres` (
`genre_pk` tinyint(2) unsigned NOT NULL AUTO_INCREMENT,
 `genre_name` varchar(90) NOT NULL,
  PRIMARY KEY (`genre_pk`),
 UNIQUE KEY `genre_name` (`genre_name`)
) ENGINE=InnoDB AUTO_INCREMENT=255 DEFAULT CHARSET=latin1 |

提前感谢您解决我的问题,我不知道的东西太多了 - 学习很有趣,但同时也令人沮丧!

【问题讨论】:

    标签: mysql load-data-infile


    【解决方案1】:

    我认为你有 2 个问题。

    1。 AUTO_INCREMENT 值

    在你的 DDL 中,

    • genre_pk 是 TINYINT。所以genre_pk可以容纳0~255。
    • 在 CREATE STATEMENT 的末尾,AUTO_INCREMENT=255
      • 这会将 genre_pk 的初始值设置为 255

    2。终止于

    的行

    您需要将 LINES TERMINATED BY 从 '\r' 更改为 '\n'

    3。总结

    我已经测试了以下 SQL,它运行良好。

    DDL

    CREATE TABLE `genres` (
    `genre_pk` tinyint(2) unsigned NOT NULL AUTO_INCREMENT,
     `genre_name` varchar(90) NOT NULL,
      PRIMARY KEY (`genre_pk`),
     UNIQUE KEY `genre_name` (`genre_name`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
    

    加载数据

    LOAD DATA INFILE '/path/to/Music_All_2.csv'
    INTO TABLE genres FIELDS TERMINATED BY ',' ESCAPED BY '\\'
    LINES TERMINATED BY '\n' IGNORE 1 LINES (genre_name);
    

    回复 OP 的评论

    1) 如何重置 AUTO_INCREMENTed 值

    • 当表中有不应删除的数据时。

      ALTER TABLE table_name AUTO_INCREMENT = n;
      
    • 何时可以删除现有数据。 (这是你已经尝试过的)

      TRUNCATE TABLE table_name;
      

    2) '\n' 与 '\r'

    这很奇怪。一般来说,

    • '\n' 用于 Unix 系统
    • '\r\n' 适用于 Windows 系统

    我从来没有听说过 '\r' 用于回车。 MySQL manaul(http://dev.mysql.com/doc/refman/5.5/en/load-data.html) 声明

    如果您在 Windows 系统上生成了文本文件,您可能必须使用 LINES TERMINATED BY '\r\n' 来正确读取文件,因为 Windows 程序通常使用两个字符作为行终止符。某些程序,例如 WordPad,在写入文件时可能会使用 \r 作为行终止符。要读取此类文件,请使用 LINES TERMINATED BY '\r'。

    【讨论】:

    • 这太好了,谢谢。我应该注意到那些自动增量数字(我有另一个表卡在 65,535 上!)
    • 关于我的 2 个问题:(1)我可以重置 AUTO-INCREMENT 值而不是使字段长度更大吗?和 (2) 当我第一次在我的 CSV 上尝试 LOAD DATA INFILE 时,我使用的是 \n,但只有当我将其切换到 \r 时它才有效——这些数据是直接从 iTunes 中取出的 <Ctrl-C>d...
    • 我使用TRUNCATE 重置AUTO-INCREMENT 并基本上从我的数据重新开始;但是\n 真的不适合我!我通过上面的 2 条记录得到了这个结果(使用我新重置的 AUTO-INCREMENT) Records: 0 Deleted: 0 Skipped: 0 Warnings: 0 ... 但是当我更改为 \r 时,成功添加了 2 条记录。
    • @simien 我已经更新了我的答案;-)。如果我的回答对您有帮助,请随时为我的回答投票。
    • 我一直在等待您对这个讨厌的回车业务的回复!我在一个新的 Mac 上,使用 Office for Mac 2011。\r\n 也不适用于我(与\n 相同的非结果)。
    猜你喜欢
    • 2015-03-11
    • 1970-01-01
    • 2013-07-09
    • 2020-06-13
    • 2012-09-02
    • 2020-06-26
    • 1970-01-01
    • 2012-07-03
    • 2011-05-06
    相关资源
    最近更新 更多