如何在NULL
期间将缺少的csv字段值设置为sql LOAD DATA
?以下示例中的问题是,如果mysql
字段仅提供空白,则dob
不允许我导入文件:
create table persons (
id bigint(20) NOT NULL AUTO_INCREMENT,
dob date DEFAULT NULL,
lastname varchar(20) NOT NULL,
//in real world having 100 columns!
PRIMARY KEY (id)
);
import.csv,缺少生日:
1;;doe
2;;dane
...
导入百万行:
LOAD DATA INFILE 'import.csv' INTO TABLE persons FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n';
我当然可以使用:
(@col1, @col2... @col100)
SET date = nullif(@col2,''),
lastfield = nullif(@col100,'')
;
但是这意味着我必须明确地重复所有列,出于维护原因,我试图避免这些列。我有什么机会?
或者我能以某种方式仅定义非字符字段并在其上使用nullif
吗?
(@col2)
SET date = nullif(@col2,'');
剩下的留着吗?
从reference manual of MySQL 8.0开始
NULL值的处理取决于所使用的FIELDS和LINES选项:
对于默认的FIELDS和LINES值,NULL作为输出的\ N字段值被写入,而\ N的字段值对于输入则被读取为NULL(假定ESCAPED BY字符为\)。] >
如果FIELDS ENCLOSED BY不为空,则将包含文字单词NULL作为其值的字段读取为NULL值。这与包含在FIELDS ENCLOSED BY字符中的单词NULL不同,后者被读取为字符串'NULL'。
如果FIELDS ESCAPED BY为空,则将NULL写入单词NULL。
使用固定行格式(当FIELDS TERMINATED BY和FIELDS ENCLOSED BY均为空时使用),NULL被写为空字符串。这将导致NULL值和表中的空字符串在写入文件时无法区分,因为它们都是作为空字符串写入的。如果需要能够在回读文件时将两者区分开,则不应使用固定行格式。
因此,如果您不想为可为空的列编写
nullif
函数,但是对文件的生成方式有一些控制权,则可以将其调整为以下选项之一以区分NULL和空字符串或单词“ NULL”。