180

我有一个文件,其中可以包含 3 到 4 列用逗号分隔的数值。空字段定义为例外,当它们位于行尾时:

1,2,3,4,5
1,2,3,,5
1,2,3

下表是在 MySQL 中创建的:

+-------+--------+------+------+---------+--------+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+-------+--------+------+------+---------+--------+
| 一个 | 整数(1) | 是 | | 空 | |
| 二 | 整数(1) | 是 | | 空 | |
| 三 | 整数(1) | 是 | | 空 | |
| 四 | 整数(1) | 是 | | 空 | |
| 五 | 整数(1) | 是 | | 空 | |
+-------+--------+------+------+---------+--------+

我正在尝试使用 MySQL LOAD 命令加载数据:

LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS 
TERMINATED BY "," LINES TERMINATED BY "\n";

结果表:

+------+------+--------+------+------+
| 一个 | 二 | 三 | 四 | 五 |
+------+------+--------+------+------+
| 1 | 2 | 3 | 4 | 5 |
| 1 | 2 | 3 | 0 | 5 |
| 1 | 2 | 3 | 空 | 空 |
+------+------+--------+------+------+

问题在于,当原始数据中的字段为空且未定义时,MySQL 出于某种原因不使用列默认值(即 NULL)并使用零。当字段全部丢失时,正确使用 NULL。

不幸的是,在这个阶段我必须能够区分 NULL 和 0,所以任何帮助都将不胜感激。

谢谢S。

编辑

显示警告的输出:

+---------+------+-------------------------------- ------------------------------------+
| 水平 | 代码 | 留言 |
+---------+------+-------------------------------- ------------------------------------+
| 警告 | 第1366章 不正确的整数值:第 2 行的列 'four' 的 '' |
| 警告 | 第1261章 第 3 行不包含所有列的数据 |
| 警告 | 第1261章 第 3 行不包含所有列的数据 |
+---------+------+-------------------------------- ------------------------------------+
4

7 回答 7

217

这将做你想要的。它将第四个字段读入局部变量,然后将实际字段值设置为 NULL,如果局部变量最终包含一个空字符串:

LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(one, two, three, @vfour, five)
SET four = NULLIF(@vfour,'')
;

如果它们都可能为空,那么您会将它们全部读入变量并具有多个 SET 语句,如下所示:

LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(@vone, @vtwo, @vthree, @vfour, @vfive)
SET
one = NULLIF(@vone,''),
two = NULLIF(@vtwo,''),
three = NULLIF(@vthree,''),
four = NULLIF(@vfour,'')
;
于 2011-05-11T17:59:09.040 回答
150

MySQL手册说:

使用 LOAD DATA INFILE 读取数据时,空列或缺失列将使用 '' 进行更新。如果您想在列中使用 NULL 值,则应在数据文件中使用 \N。在某些情况下也可以使用字面意思“NULL”。

所以你需要用 \N 替换空格,如下所示:

1,2,3,4,5
1,2,3,\N,5
1,2,3
于 2010-04-20T13:36:27.860 回答
6

行为因数据库配置而异。在严格模式下,这会引发错误,否则会发出警告。以下查询可用于识别数据库配置。

mysql> show variables like 'sql_mode';
于 2015-01-22T17:10:39.147 回答
3

预处理您的输入 CSV 以用 \N 替换空白条目。

尝试正则表达式:s/,,/,\n,/g 和 s/,$/,\N/g

祝你好运。

于 2010-04-20T13:29:38.350 回答
1

显示变量

Show variables like "`secure_file_priv`";

注意:将您的 csv 文件保存在上述命令给出的位置。

create table assessments (course_code varchar(5),batch_code varchar(7),id_assessment int, assessment_type varchar(10), date int , weight int);

注意:这里的 ' date' 列在 csv 文件中有一些空白值。

LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/assessments.csv' 
INTO TABLE assessments
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS 
(course_code,batch_code,id_assessment,assessment_type,@date,weight)
SET date = IF(@date = '', NULL, @date);
于 2019-03-23T11:28:58.567 回答
0

(variable1, @variable2, ..) SET variable2 = nullif(@variable2, '' or ' ') >> 你可以放任何条件

于 2020-04-25T08:42:39.183 回答
-1

\N在 UNIX 终端中使用以下 sed 命令将输入​​文件转换为包含空白列数据:

sed -i 's/,,/,\\N,/g' $file_name

然后使用LOAD DATA INFILE命令加载到mysql

于 2020-11-28T12:29:31.837 回答