私は、CSVファイルを受け取り、そのフォーマットを修正し(必要に応じて)、コンテンツをMariaDBデータベースにロードするBash ETLプロセスを使用しています。私は、データベースに保存されたレコードがファイル内のレコードよりも少なく、その理由を理解しようとしていることがわかりました。そのプロセスの一環として、mysql
コマンドに-vv
を追加して、それが何をしているかを確認し、出力が私を投げているのを確認します。MySQL LOAD DATAの出力を理解しない
インポートするファイルには、行(ヘッダーを含む)があります。
マイコマンド:
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
これは、テーブルに最初のインポートです:
out=$(mysql -h ${host} \
-vv \
-P ${port} \
-u ${user} \
-p"${password}" \
--local-infile \
my_table < ${scriptDir}/${target}.sql 2>&1)
関連応答は、この(私は改行を追加しました)のように見えます。この声明で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は 'Deleted:'ではなく 'Duplicates:'を使用していますので、これが匹敵するかどうかはわかりません。 –
テーブルの 'create'を提供してください? – Dekel