我有一個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