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?
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.
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;