web-dev-qa-db-fra.com

MySQL LOAD DATA INFILE avec ON DUPLICATE KEY UPDATE

Pour charger d'énormes quantités de données dans MySQL, LOAD DATA INFILE est de loin l'option la plus rapide. Malheureusement, bien que cela puisse être utilisé d'une manière INSERT IGNORE ou REPLACE fonctionne, ON DUPLICATE KEY UPDATE n'est pas actuellement pris en charge.

Toutefois, ON DUPLICATE KEY UPDATE a des avantages sur REPLACE. Ce dernier effectue une suppression et une insertion lorsqu'un doublon existe. Cela entraîne des frais généraux pour la gestion des clés. De plus, les identifiants d'auto-incrémentation ne resteront pas les mêmes lors d'un remplacement.

Comment puis ON DUPLICATE KEY UPDATE être émulé lors de l'utilisation de LOAD DATA INFILE?

39
Jan

Ces étapes peuvent être utilisées pour émuler cette fonctionnalité:

1) Créez une nouvelle table temporaire.

CREATE TEMPORARY TABLE temporary_table LIKE target_table;

2) Facultativement, supprimez tous les indices de la table temporaire pour accélérer les choses.

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

3) Chargez le CSV dans la table temporaire

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

4) Copiez les données en utilisant 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) Retirez la table temporaire

DROP TEMPORARY TABLE temporary_table;

En utilisant SHOW INDEX FROM et SHOW COLUMNS FROM ce processus peut être automatisé pour n'importe quelle table donnée.

81
Jan

nous pouvons remplacer d'abord (deux étapes) par une seule requête ci-dessous dans la procédure partagée par (Jan).

1) et 2), nous pouvons créer une nouvelle table avec la même structure de référence et sans index.

CREATE TEMPORARY TABLE table_temporaire SELECT * FROM table_cible WHERE 1 = 0;

Au lieu de..

1) Créez une nouvelle table temporaire.

CREATE TEMPORARY TABLE table_temporaire LIKE table_table;

2) Facultativement, supprimez tous les indices de la table temporaire pour accélérer les choses.

AFFICHER L'INDICE DE table_temporaire; DROP INDEX PRIMARY ON table_temporaire; DROP INDEX some_other_index ON table_temporaire;

3
Suneet Khurana