[英]How to LOAD DATA with optional fields?
是否可以将csv
的LOAD 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.