与对重复密钥更新MySQL的LOAD DATA INFILE(MySQL LOAD DATA

2019-07-21 03:23发布

对于加载大量的数据到MySQL, LOAD DATA INFILE是迄今为止最快的选项。 不幸的是,虽然这可以在某种程度上INSERT使用忽视或更换工作,对重复密钥更新目前不支持。

然而, ON DUPLICATE KEY UPDATE具有优于REPLACE 。 后者则删除和插入时,存在重复。 这带来了关键的管理开销。 此外,自动增量IDS不会停留在更换相同。

如何ON DUPLICATE KEY UPDATE使用LOAD DATA INFILE时效仿?

Answer 1:

这些步骤可用于模拟此功能:

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密钥更新复制数据

SHOW COLUMNS FROM target_table;
INSERT INTO target_table
SELECT * FROM temporary_table
ON DUPLICATE KEY UPDATE field1 = VALUES(field1), field2 = VALUES(field2);

5)拆下临时表

DROP TEMPORARY TABLE temporary_table;

使用SHOW INDEX FROMSHOW COLUMNS FROM这个过程可以自动对任何给定的表。



Answer 2:

我们可以先(两步)以取代以下单个查询中由(月)共享的过程。

1)和2),我们可以创建具有相同的参考结构,没有任何索引新表。

CREATE TEMPORARY TABLE temporary_table SELECT * FROM target_table WHERE 1 = 0;

代替..

1)创建一个新的临时表。

CREATE TEMPORARY TABLE temporary_table LIKE target_table;

2)可选,删除所有指数从临时表来加快速度。

SHOW指数从temporary_table; DROP INDEX PRIMARY ON temporary_table; DROP INDEX some_other_index ON temporary_table;



文章来源: MySQL LOAD DATA INFILE with ON DUPLICATE KEY UPDATE