csv 如何使用可选字段加载数据?

cqoc49vn  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(77)

是否可以将LOAD DATA a csv转换为mysql,而不必在末尾为不存在的列添加 * 空 * 值?
我所有的可选列都在模式的末尾排序:

CREATE TABLE `person` (
    id int(20) NOT NULL AUTO_INCREMENT,
    firstname varchar(30) NOT NULL,
    lastname varchar(30) NOT NULL,
    optional1 varchar DEFAULT NULL,
    optional... varchar DEFAULT NULL,
    optional50 varchar DEFAULT NULL,
    PRIMARY KEY (`id`)
) engine=innodb AUTO_INCREMENT=0;

字符串
sample.csv:

1;john;doe
2;jabe;doe;;;opt val3;;;;;;opt val9;;;;;;...


重要提示:我不想显式列出LOAD DATA INFILE sql语句中的所有列(我知道这可以通过使用IFNULL@var的组合来实现)。
但是,我不能只是加载到表中,告诉mysql忽略每行末尾的任何丢失的字段吗?

dddzy1tm

dddzy1tm1#

MySQL LOAD DATA syntax的文档提供了以下信息:
默认情况下,当LOAD DATA语句的末尾没有提供列列表时,输入行应该包含每个表列的字段。如果只想加载表的某些列,请指定列列表。
[...]
如果输入行的字段太少,则缺少输入字段的表列将设置为默认值。对于数值类型,该列将设置为0
[...]
空字段值的解释与缺少字段的解释不同:对于字符串类型,列被设置为空字符串。
因此,给定您的样本数据:

1;john;doe
2;jabe;doe;;;opt val3;;;;;;opt val9;;;;;;...

字符串
ID为1的记录将所有可选列设置为NULL(即默认值)。对于id 2,可选字符串列将设置为空字符串。
我不知道这对你的用例是否合适。如果你想在可选列中保持一致的值,可用的选项是:

  • 输入预处理:使用SET将包含空字符串的列设置为NULL
LOAD DATA INFILE 'file.txt' INTO TABLE t1
    SET 
        optional1 = NULLIF(optional1, ''), 
        optional2 = NULLIF(optional1, ''), 
        ...

  • 在设置为NULL空值的表上设置BEFORE INSERT触发器
  • 在填充表 * 之后 * 对表运行更新
UPDATE t1 SET optional1 = NULLIF(option1, ''), optional2 = NULLIF(optional1, '')
    WHERE '' IN (optional1, optional2, ...)

tp5buhyn

tp5buhyn2#

我发现如果将IGNORE关键字添加到LOAD DATA语句中,它会像预期的那样工作:
LOAD DATA INFILE 'sample.csv' IGNORE INTO TABLE persons
因此,我可以将所有可选列定义为DEFAULT NULL,如果缺少值,则在导入期间将其设置为NULL

lo8azlld

lo8azlld3#

您可以使用跟踪零部件。

相关问题