由数据行的顺序触发的MySQL LOAD DATA INFILE错误

时间:2014-07-08 05:58:03

标签: mysql

如果我尝试以不同的顺序加载相同的两行数据,一次尝试就会出错,另一次尝试成功。

CREATE TABLE `test` (
  `date` varchar(20) NOT NULL DEFAULT '',
  `val1` float DEFAULT NULL,
  `val2` smallint(6) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

fail.txt

Date,Val1,Val2
3/30/2004,,17
4/4/2004,91.4210526315789,20

pass.txt

Date,Val1,Val2
4/4/2004,91.4210526315789,20
3/30/2004,,17

相同命令不同的结果

-> LOAD DATA INFILE '/tmp/fail.txt' REPLACE INTO TABLE `test` FIELDS TERMINATED BY ',' IGNORE 1 LINES;
<- ERROR 1265 (01000) at line 1: Data truncated for column 'val1' at row 1
-> SELECT * FROM test;
<- Empty set (0.00 sec)

-> LOAD DATA INFILE '/tmp/pass.txt' REPLACE INTO TABLE `test` FIELDS TERMINATED BY ',' IGNORE 1 LINES;
-> SELECT * FROM test;
<- +-----------+---------+------+
<- | date      | val1    | val2 |
<- +-----------+---------+------+
<- | 4/4/2004  | 91.4211 |   20 |
<- | 3/30/2004 |       0 |   17 |
<- +-----------+---------+------+
<- 2 rows in set (0.00 sec) 

我删除表并在尝试之间重新创建。

这是在x86_64(MySQL社区服务器(GPL)上使用:mysqld Ver 5.6.15 for osx10.7)

我有什么办法可以在不编辑数据的情况下加载fail.txt吗?

编辑:

为了它的价值,我现在相信这个问题与MySQL服务器版本和/或我正在运行的配置有关。对于另一个mysqld(Ubuntu上的5.5.32),fail.txt加载时没有错误。

编辑2:

似乎我应该能够得到以下内容,但我不知道REPLACE的第二个论点应该是什么。

LOAD DATA INFILE '/tmp/fail.txt' REPLACE INTO TABLE `test` 
FIELDS TERMINATED BY ',' IGNORE 1 LINES
(date, @val1, val2)
SET val1 = REPLACE( @val1, '', '\N');

编辑3:

想出来:

LOAD DATA INFILE '/tmp/fail.txt' REPLACE INTO TABLE `test` 
FIELDS TERMINATED BY ',' IGNORE 1 LINES
(date, @val1, val2)
SET val1 = IF( LENGTH( @val1 ) = 0, NULL, @val);

2 个答案:

答案 0 :(得分:0)

您必须在第一行val中输入值。

更改您的文件:

Date,Val1,Val2
3/30/2004,,17
4/4/2004,91.4210526315789,20

TO

Date,Val1,Val2
3/30/2004,0,17
4/4/2004,91.4210526315789,20

或查看mysql文档:

  

使用LOAD DATA INFILE读取数据时,列为空或缺少   更新为&#39;&#39;。如果要在列中使用NULL值,则应使用   \ n在数据文件中。文字“NULL”也可以在下面使用   某些情况。

chnage it to:

Date,Val1,Val2
3/30/2004,\N,17
4/4/2004,91.4210526315789,20

答案 1 :(得分:0)

请参阅问题中的EDIT 3。以下对我有用。

LOAD DATA INFILE '/tmp/fail.txt' REPLACE INTO TABLE `test` 
FIELDS TERMINATED BY ',' IGNORE 1 LINES
(date, @val1, val2)
SET val1 = IF( LENGTH( @val1 ) = 0, NULL, @val);