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;