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

问题描述 投票:0回答:1

如何在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,'');

剩下的留着吗?

mysql load-data-infile
1个回答
0
投票

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”。

© www.soinside.com 2019 - 2024. All rights reserved.