是否可以将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忽略每行末尾的任何丢失的字段吗?
3条答案
按热度按时间dddzy1tm1#
MySQL
LOAD DATA
syntax的文档提供了以下信息:默认情况下,当
LOAD DATA
语句的末尾没有提供列列表时,输入行应该包含每个表列的字段。如果只想加载表的某些列,请指定列列表。[...]
如果输入行的字段太少,则缺少输入字段的表列将设置为默认值。对于数值类型,该列将设置为
0
。[...]
空字段值的解释与缺少字段的解释不同:对于字符串类型,列被设置为空字符串。
因此,给定您的样本数据:
字符串
ID为
1
的记录将所有可选列设置为NULL
(即默认值)。对于id
2,可选字符串列将设置为空字符串。我不知道这对你的用例是否合适。如果你想在可选列中保持一致的值,可用的选项是:
SET
将包含空字符串的列设置为NULL
型
NULL
空值的表上设置BEFORE INSERT
触发器型
tp5buhyn2#
我发现如果将
IGNORE
关键字添加到LOAD DATA
语句中,它会像预期的那样工作:LOAD DATA INFILE 'sample.csv' IGNORE INTO TABLE persons
因此,我可以将所有可选列定义为
DEFAULT NULL
,如果缺少值,则在导入期间将其设置为NULL
。lo8azlld3#
您可以使用跟踪零部件。