【问题标题】:How to LOAD DATA with optional fields?如何使用可选字段加载数据?
【发布时间】:2020-02-17 17:32:15
【问题描述】:

是否可以将 LOAD DATAcsv 转换为 mysql 而不必在末尾为不存在的列添加 empty 值?

我所有的可选列都在模式的末尾排序:

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 忽略每行末尾的任何缺失字段吗?

【问题讨论】:

  • 如果您愿意采用不同的方法来执行 SQL 语句,则 execsql.py (pypi.org/project/execsql) 的 IMPORT 元命令将加载短行数据。免责声明:我写了 execsql。您应该将“empty_strings”配置参数设置为“No”以强制 execsql 使用其自己的数据加载例程而不是 LOAD DATA LOCAL INFILE。

标签: mysql sql csv sql-insert load-data-infile


【解决方案1】:

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

默认情况下,当LOAD DATA 语句末尾没有提供列列表时,输入行应包含每个表列的字段。如果您只想加载表格的某些列,请指定列列表。

[...]

如果输入行的字段太少,则将缺少输入字段的表列设置为其默认值。对于数字类型,该列设置为0

[...]

空字段值的解释不同于缺失字段:对于字符串类型,该列设置为空字符串。

因此,鉴于您的示例数据:

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

ID 为1 的记录将所有可选列设置为NULL(即它们的默认值)。对于id2,可选字符串列将设置为空字符串。 .

我不知道这是否适合您的用例。如果您确实希望可选列中的值保持一致,可用的选项是:

  • 输入预处理:使用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, ...)

【讨论】:

  • 我知道,但是我必须明确列出我的所有 X 可选列,不是吗?我正在寻找一个通用的解决方案。我的意思是,在您的示例中,它们会总是被跳过。但如果 csv 行中不存在这些可选列,我只想跳过这些列。
  • “如果输入行的字段太少,则将缺少输入字段的表列设置为其默认值。” 如果这是真的,我会很高兴.但是在尝试加载示例时,我得到了ERROR 1261 (01000): Row 1 doesn't contain data for all columns
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2021-08-16
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多