Подтвердить что ты не робот

MySQL LOAD DATA INFILE с ON DUPLICATE KEY UPDATE

Для загрузки огромных объемов данных в MySQL LOAD DATA INFILE является самым быстрым вариантом. К сожалению, хотя это можно использовать так, как работает INSERT IGNORE или REPLACE, ON DUPLICATE KEY UPDATE в настоящее время не поддерживается.

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

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

4b9b3361

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

Ответ 2

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

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

CREATE TEMPORARY TABLE временная таблица SELECT * FROM target_table WHERE 1 = 0;

Вместо..

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

СОЗДАТЬ ВРЕМЕНУ ТАБЛИЦУ tempor_table LIKE target_table;

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

ПОКАЖИТЕ ИНДЕКС ИЗ временного_таблица; DROP INDEX PRIMARY ВКЛ. Временная таблица; DROP INDEX some_other_index ВКЛ. Временная таблица;