MySQL загружает данные INFILE с on DUPLICATE KEY UPDATE

для загрузки огромных объемов данных в MySQL, ЗАГРУЗИТЬ ДАННЫЕ INFILE Это самый быстрый вариант. К сожалению, хотя это можно использовать таким образом, INSERT IGNORE или REPLACE works, в настоящее время не поддерживается обновление дубликатов ключей.

, ON DUPLICATE KEY UPDATE имеет преимущества перед REPLACE. Последний выполняет удаление и вставку, когда существует дубликат. Это накладные расходы для управления ключами. Кроме того, идентификаторы autoincrement не будут оставаться неизменными на заменять.

как ON DUPLICATE KEY UPDATE эмулировать при использовании load DATA INFILE?

2 ответов


эти шаги можно использовать для эмуляции этой функции:

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) скопируйте данные, используя дубликат ключа UPDATE

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 FROM и SHOW COLUMNS FROM этот процесс может быть автоматизировано для любой таблицы.


мы можем заменить первый (два шага) на ниже один запрос в процедуре, совместно используемой (Jan).

1) и 2) мы можем создать новую таблицу с такой же структурой ссылки и без всех индексов.

создать временную таблицу temporary_table выберите * из target_table, где 1=0;

вместо..

1) Создайте новую временную таблицу.

создать временную таблицу temporary_table как target_table;

2) необязательно, отбросьте все индексы из временной таблицы, чтобы ускорить процесс.

показать индекс из temporary_table; DROP INDEX PRIMARY на temporary_table; DROP INDEX some_other_index на temporary_table;