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