web-dev-qa-db-fra.com

Importer CSV pour mettre à jour les lignes du tableau

Il y a environ 26K produits (messages) et chaque produit a des méta-valeurs comme ceci:

enter image description here

La colonne post_id est l'ID du produit dans db et le _sku (meta_key) est l'ID unique de chaque produit.

J'ai reçu un nouveau fichier CSV qui met à jour toutes les valeurs (meta_value) pour _sale_price (meta_key) de chaque produit. Le fichier CSV ressemble à:
SKU, prix de vente

Comment importer ce fichier CSV pour mettre à jour uniquement la ligne _sale_price en fonction de la valeur post_id (id produit) & _sku?

Exemple de sortie:

enter image description here

Je sais comment faire cela en PHP en parcourant le CSV et en sélectionnant et en exécutant une mise à jour pour chaque produit mais cela semble inefficace.

De préférence avec phpMyAdmin et en utilisant LOAD DATA INFILE.

20
Irfan Dayan

Vous pouvez utiliser une table temporaire pour contenir les données de mise à jour, puis exécuter une seule instruction de mise à jour.

CREATE TEMPORARY TABLE temp_update_table (meta_key, meta_value)

LOAD DATA INFILE 'your_csv_pathname' 
INTO TABLE temp_update_table FIELDS TERMINATED BY ';' (meta_key, meta_value); 

UPDATE "table"
INNER JOIN temp_update_table on temp_update_table.meta_key = "table".meta_key
SET "table".meta_value = temp_update_table.meta_value;

DROP TEMPORARY TABLE temp_update_table;
34
rAndom69

Vous pouvez importer les nouvelles données dans une autre table (table2). Mettez ensuite à jour votre table principale (table1) à l'aide d'une mise à jour avec une sous-sélection:

UPDATE table1 t1 set 
  sale_price = (select meta_value from table2 t2 where t2.post_id = t1.product_id)
WHERE
  (select count(*) from table2 t2 where t1.product_id = t2.post_id) > 0

Il s'agit évidemment d'une simplification et vous aurez très probablement besoin de contraindre un peu plus votre requête.

Assurez-vous de sauvegarder votre base de données complète avant de tenter. Je vous recommande de travailler sur une base de données hors production jusqu'à ce que le processus fonctionne parfaitement.

3
David H. Bennett

Si product_id est la colonne unique de cette table, vous pouvez le faire en utilisant CSV:

  1. Ayez un fichier CSV de ceux que vous souhaitez importer avec leur ID unique. Le fichier CSV doit être dans le même ordre que la colonne de la table, mettre toutes vos colonnes et aucun nom de colonne

  2. Puis dans phpMyAdmin, allez dans le tableau de base de données, cliquez sur importer

  3. Sélectionnez CSV dans le menu déroulant du champ Format

  4. Assurez-vous que "Mettre à jour les données lorsque des clés en double trouvées lors de l'importation (ajouter ON DUPLICATE KEY UPDATE)" est cochée.

image

3
Felix Labayen