[英]How to use null as default value on a mysql decimal field with LOAD DATA?
[英]How to LOAD DATA setting default value NULL if column field is empty?
如何在LOAD DATA
期间将缺少的 csv 字段值设置为 sql NULL
? 以下示例中的问题是,如果dob
字段仅提供空白, mysql
将不允许我导入文件:
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,'');
让 rest 保持原样?
NULL 值的处理因使用的 FIELDS 和 LINES 选项而异:
对于默认的 FIELDS 和 LINES 值,对于 output,NULL 的字段值写入为 \N,对于 Z6C3E226B4D4795D518AB341B082ESCAPED2 的字段值读取为 Z6C3E226B4D4795D518AB341B082ESCAPED2 的字段值(B0824ECED2)。
如果 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 和空字符串或单词'无效的'。
所以让你的文件像
1;\N;doe
2;\N;dane
或喜欢
"1";NULL;"doe"
"2";NULL;"dane"
使用正确的 FIELDS 和 LINES 选项就可以了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.