web-dev-qa-db-fra.com

Importer CSV pour mettre à jour une seule colonne du tableau

J'ai une table qui ressemble à ceci:

products
--------
id, product, sku, department, quantity

Il y a environ 800 000 entrées dans ce tableau. J'ai reçu un nouveau fichier CSV qui met à jour toutes les quantités de chaque produit, par exemple:

productA, 12
productB, 71
productC, 92

Il y a donc environ 750 000 mises à jour (50 000 produits n'ont pas changé de quantité).

Ma question est, comment importer ce CSV pour mettre à jour uniquement la quantité basée sur le product (unique) mais laisser les sku, department et autres champs seuls? Je sais comment faire cela en PHP en parcourant le CSV et en exécutant une mise à jour pour chaque ligne mais cela semble inefficace.

43
Ryan Kempt

Vous pouvez utiliser LOAD DATA INFILE pour charger en bloc les 800 000 lignes de données dans une table temporaire, puis utilisez la syntaxe à tables multiples UPDATE pour joindre votre table existante à la table temporaire et mettre à jour la quantité valeurs.

Par exemple:

CREATE TEMPORARY TABLE your_temp_table LIKE your_table;

LOAD DATA INFILE '/tmp/your_file.csv'
INTO TABLE your_temp_table
FIELDS TERMINATED BY ','
(id, product, sku, department, quantity); 

UPDATE your_table
INNER JOIN your_temp_table on your_temp_table.id = your_table.id
SET your_table.quantity = your_temp_table.quantity;

DROP TEMPORARY TABLE your_temp_table;
114
Ike Walker

Je chargerais les données de mise à jour dans une table séparée UPDATE_TABLE et effectuer une mise à jour dans MySQL en utilisant:

UPDATE PRODUCTS P SET P.QUANTITY=(
    SELECT UPDATE_QUANTITY
    FROM UPDATE_TABLE
    WHERE UPDATE_PRODUCT=P.PRODUCT
)

Je n'ai pas de MySQL sous la main en ce moment, donc je peux vérifier la syntaxe parfaitement, il se peut que vous deviez ajouter un LIMIT 0,1 à l'intérieur SELECT.

5
DocJones