寶慕林4294392
2019-08-27 13:43:33
帶有ON DUPLICATE KEY UPDATE的MySQL LOAD DATA INFILE為了將大量數據加載到MySQL中,LOAD DATA INFILE是迄今為止最快的選擇。不幸的是,雖然這可以以INSERT IGNORE或REPLACE的方式使用,但目前不支持ON DUPLICATE KEY UPDATE。但是,ON DUPLICATE KEY UPDATE有優勢REPLACE。當存在重復時,后者執行刪除和插入。這為密鑰管理帶來了開銷。此外,自動增量ID在替換時不會保持不變。ON DUPLICATE KEY UPDATE使用LOAD DATA INFILE時如何模擬?
2 回答

慕勒3428872
TA貢獻1848條經驗 獲得超6個贊
這些步驟可用于模擬此功能:
1)創建一個新的臨時表。
CREATE TEMPORARY TABLE temporary_table LIKE target_table;
2)(可選)從臨時表中刪除所有索引以加快速度。
SHOW INDEX FROM temporary_table;DROP INDEX `PRIMARY` ON temporary_table;DROP INDEX `some_other_index` ON temporary_table;
3)將CSV加載到臨時表中
LOAD DATA INFILE 'your_file.csv'INTO TABLE temporary_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'(field1, field2);
4)使用ON DUPLICATE KEY UPDATE復制數據
SHOW COLUMNS FROM target_table;INSERT INTO target_tableSELECT * FROM temporary_tableON DUPLICATE KEY UPDATE field1 = VALUES(field1), field2 = VALUES(field2);
5)刪除臨時表
DROP TEMPORARY TABLE temporary_table;
使用SHOW INDEX FROM
和SHOW COLUMNS FROM
此過程可以針對任何給定的表自動執行。

開滿天機
TA貢獻1786條經驗 獲得超13個贊
我們可以在(Jan)共享的過程中用下面的單個查詢替換第一個(兩個步驟)。
1)和2)我們可以創建具有相同參考結構且沒有任何索引的新表。
CREATE TEMPORARY TABLE temporary_table SELECT * FROM target_table WHERE 1 = 0;
代替..
1)創建一個新的臨時表。
CREATE TEMPORARY TABLE temporary_table LIKE target_table;
2)(可選)從臨時表中刪除所有索引以加快速度。
顯示來自temporary_table的索引; DROP INDEX PRIMARY
ON temporary_table; DROP INDEX some_other_index
ON temporary_table;
添加回答
舉報
0/150
提交
取消