我有一个Bash ETL过程,它接受一个CSV文件,修复它的格式(如果需要)并将内容加载到MariaDB数据库中。我发现保存到数据库的记录少于文件中的记录,我试图理解为什么。作为该过程的一部分,我将-vv
添加到mysql
命令中,以查看它正在执行的操作,并且输出正在抛出我。不理解MySQL输出LOAD DATA
我正在导入的文件有行(包括标题)。
我的命令:
out=$(mysql -h ${host} \
-vv \
-P ${port} \
-u ${user} \
-p"${password}" \
--local-infile \
my_table < ${scriptDir}/${target}.sql 2>&1)
相关回应看起来像这样(我加了换行):
LOAD DATA LOCAL INFILE '/tmp/mydata.csv'
REPLACE INTO TABLE my_table CHARACTER SET utf8
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
SET updated_at = NOW()
--------------
Query OK, 410 rows affected, 1460 warnings
Records: 365 Deleted: 45 Skipped: 0 Warnings: 1460 Bye
这是第一次导入到表中。任何想法可能导致这条语句删除45条记录?
任何想法将不胜感激。
UPDATE
按照要求,这里是表的定义:
CREATE TABLE `my_table` (
`First Name` varchar(255) DEFAULT NULL,
`Last Name` varchar(255) DEFAULT NULL,
`Company` varchar(255) DEFAULT NULL,
`Email` varchar(255) DEFAULT NULL,
`Campaign Name` varchar(255) DEFAULT NULL,
`Event Date` date DEFAULT NULL,
`Live Views Duration` varchar(255) DEFAULT NULL,
`On Demand Views Duration` varchar(255) DEFAULT NULL,
`Job Title` varchar(255) DEFAULT NULL,
`Reg Date` varchar(255) DEFAULT NULL,
`Affiliate Data` varchar(255) DEFAULT NULL,
`Phone 1` varchar(255) DEFAULT NULL,
`City` varchar(255) DEFAULT NULL,
`State` varchar(255) DEFAULT NULL,
`Postal Code` varchar(255) DEFAULT NULL,
`Country` varchar(255) DEFAULT NULL,
`Industry` varchar(255) DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uix_conversion` (`Email`,`Campaign Name`,`Event Date`),
KEY `ix_campaign_name` (`Campaign Name`)
) ENGINE=InnoDB AUTO_INCREMENT=512 DEFAULT CHARSET=utf8;
UPDATE
过了一段时间了,我已经删除,没有变化的唯一指标。我还将REPLACE
查询更改为IGNORE
查询,现在跳过而不是删除记录。同样的净影响。而且,在多次测试同一个文件时,似乎缺少的记录并不总是相同的缺失记录。不知道这里发生了什么......
您正在使用'REPLACE INTO'。你确定导入文件中没有重复记录吗?虽然我从来没有测试过,但我希望它们能够被加载,然后再被替换。 –
我的版本5.7.16使用'Duplicates:'在那里,而不是'Deleted:'所以我不确定这是否可比。 –
请提供表的“创建”? – Dekel