我已经搜遍了,似乎无法弄清楚,所以这是我的第一个 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');
任何帮助,将不胜感激。