2013-03-07 11 views
29

Do ładowania ogromnych ilości danych do MySQL, LOAD DATA INFILE jest zdecydowanie najszybszą opcją. Niestety, chociaż można tego używać w sposób INSERT IGNORE lub REPLACE works, ON DUPLICATE KEY UPDATE nie jest obecnie obsługiwany.MySQL LOAD DATA INFILE z DUPLICATE KEY UPDATE

Jednak, ON DUPLICATE KEY UPDATE ma przewagę nad REPLACE. Ta ostatnia wykonuje usuwanie i wstawia, gdy istnieje duplikat. To przynosi koszty dla kluczowego zarządzania. Również identyfikatory autoinkrementacji nie będą zachowywać się na zamienniku.

W jaki sposób można emulować ON DUPLICATE KEY UPDATE przy użyciu opcji ZAŁADUJ DANE INFILE?

Odpowiedz

60

Kroki te mogą być wykorzystywane do naśladowania tej funkcji:

1) Utwórz nową tabelę tymczasową.

CREATE TEMPORARY TABLE temporary_table LIKE target_table; 

2) Opcjonalnie, usuń wszystkie indeksy z tabeli tymczasowej, aby przyspieszyć działanie.

SHOW INDEX FROM temporary_table; 
DROP INDEX `PRIMARY` ON temporary_table; 
DROP INDEX `some_other_index` ON temporary_table; 

3) Załaduj CSV do tabeli tymczasowej

LOAD DATA INFILE 'your_file.csv' 
INTO TABLE temporary_table 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
(field1, field2); 

4) Kopiowanie danych za pomocą ON duplikat 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) Zdjąć tabeli tymczasowej

DROP TEMPORARY TABLE temporary_table; 

Korzystanie z SHOW INDEX FROM i SHOW COLUMNS FROM proces ten można zautomatyzować dla dowolnej tabeli.

+3

Proponuję raczej użyć 'INSERT INTO target_table SELECT coloumn_name1, coloumn_name1 FROM temporary_table' ponieważ * będzie zawierać klucz podstawowy i powodować, że elementy o tym samym kluczu podstawowym (w przypadku klucza kluczowego auto_increment) w tabeli głównej będą aktualizowane w przeciwnym razie to działało dla mnie! – JonoCoetzee

+0

Dzięki za odpowiedź, pracował dla mnie po trochę żonglerki SQL. Mój SQL-fu jest bardzo zardzewiały, fajnie się uczyć takich fajnych technik. – Chubas

+0

Dzięki stąd też - działa znakomicie - nie sądzę, że można było wykonać KLUCZ DUPLIKATOWY z INFISTRATĄ DANYCH LOAD, więc nigdy wcześniej nie próbowałem. – Shaun

1

Możemy zastąpić pierwsze (dwa kroki) poniższym pojedynczym zapytaniem w procedurze udostępnionej przez (Jan).

1) i 2) możemy stworzyć nową tabelę o tej samej strukturze referencyjnej i bez żadnych indeksów.

Tworzenie tabeli tymczasowej temporary_table SELECT * FROM target_table WHERE 1 = 0;

Zamiast ..

1) Utwórz nowy tabelę tymczasową.

Tworzenie tabeli tymczasowej temporary_table LIKE target_table;

2) Opcjonalnie, usuń wszystkie indeksy z tabeli tymczasowej, aby przyspieszyć działanie.

POKAŻ INDEKS Z pliku temporary_table; DROP INDEX PRIMARY ON temporary_table; DROP INDEX some_other_index ON temporary_table;

Powiązane problemy