如果我尝试以不同的顺序加载相同的两行数据,一次尝试就会出错,另一次尝试成功。
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);
答案 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);