1

我已经搜遍了,似乎无法弄清楚,所以这是我的第一个 Stack Exchange 问题。

我正在使用 java 程序来运行批量加载过程,但我也直接从我的 sql 客户端 MySQL Workbench 尝试过,我得到了同样的错误:

LOAD DATA INFILE '/path/to/file/infile.csv' 
INTO TABLE t1
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n'
(category, item, date_time, v1, v2, v3);

错误:

Error Code: 1062. Duplicate entry ''Book'-'Fiction'-2014-04-16 09:33:00' for key 'PRIMARY'

使用我的 sql 客户端,我已经确认表中没有这样的当前记录,实际上我在同一个月内没有相同类别类型对的任何记录。我每个月有很多(~16,000)个 CSV 文件要加载到我的 MySQL 数据库中,每个文件对应一个单独的类别类型对,在一个月内具有不同的值。到目前为止,我已经成功使用此方法加载了超过 5000 万条记录,但是如果没有出现同样的错误,我似乎无法再加载。

我的表使用 3 个字段来创建 PRIMARY 键、2 个 varchar() 和一个日期时间

'CREATE TABLE `t1` (
  `category` varchar(10) NOT NULL,
  `item` varchar(15) NOT NULL DEFAULT '''',
  `date_time` datetime NOT NULL,
  `v1` double DEFAULT NULL,
  `v2` double DEFAULT NULL,
  `v3` double DEFAULT NULL,
  PRIMARY KEY (`category`,`type`,`date_time`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1'
  • 我过去曾使用过数据库,但远没有这么多记录,我不知道这是否是问题所在。

  • 我可以切换到对我的主键使用自动递增的 id,但考虑到大量记录,它可能会占用更多空间,并且我的 (category, item, date_time) 可能会出现重复,这将是有问题的。

  • 我知道 MySQL 允许将值指定为字符串的“宽松”格式,我可能需要做一些额外的格式化来解决这个问题。

  • 我删除了值''Book'-'Fiction'-2014-04-16 09:33:00'的csv文件的第一行,但是下一个日期时间值''Book '-'小说'-2014-04-16 09:35:00'

  • 我认为这可能是我格式化日期时间字符串的方式,但我使用的是“YYYY-MM-DD HH:MM:SS”格式,该格式适用于数千个其他 LOAD DATA INFILE。为了安全起见,我尝试使用 STR_TO_DATE() 函数,见下文

    LOAD DATA INFILE '/path/to/file/infile.csv' INTO TABLE t1 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (category, item, @date_var, v1, v2, v3) SET date_time = STR_TO_DATE( @date_var, '%Y-%m-%d %H:%i:%s');

任何帮助,将不胜感激。

4

0 回答 0