繁体   English   中英

如果列字段为空,如何加载数据设置默认值 NULL?

[英]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 保持原样?

来自MySQL 8.0的参考手册

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM