繁体   English   中英

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

[英]How to LOAD DATA with optional fields?

是否可以将csvLOAD DATA加载到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;

样品.csv:

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

重要提示:我不想显式列出我的LOAD DATA INFILE sql 语句中的所有列(我知道这可以通过使用IFNULL@var的组合来实现)。

但是我不能只加载到表格中,告诉 mysql 忽略每行末尾的任何缺失字段吗?

MySQL LOAD DATA语法的文档提供了以下信息:

默认情况下,当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, ...)

我发现如果将IGNORE关键字添加到LOAD DATA语句,它会按预期工作:

LOAD DATA INFILE 'sample.csv' IGNORE INTO TABLE persons

因此,我可以将所有可选列定义为DEFAULT NULL ,如果缺少值,则在导入期间将它们设置为NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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