web-dev-qa-db-ja.com

CSVをインポートしてテーブルの行を更新する

約26Kの製品(投稿)があり、各製品には次のようなメタ値があります。

enter image description here

Post_id列はdbの製品IDであり、_sku(meta_key)は各製品の一意のIDです。

各製品の_sale_price(meta_key)のすべての値(meta_value)を更新する新しいCSVファイルを受け取りました。 CSVファイルは次のようになります。
SKU、セール価格

このCSVをインポートして、post_id(製品ID)と_sku値に基づいて_sale_price行のみを更新するにはどうすればよいですか?

出力例:

enter image description here

私はPHPでCSVをループし、各製品の更新を選択して実行することでこれを行う方法を知っていますが、これは非効率的です。

できればphpMyAdminを使用し、LOAD DATA INFILEを使用してください。

20
Irfan Dayan

一時テーブルを使用して更新データを保持し、単一の更新ステートメントを実行できます。

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

新しいデータを別のテーブル(table2)にインポートできます。次に、サブセレクト付きの更新を使用してプライマリテーブル(table1)を更新します。

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

これは明らかに単純化であり、クエリをもう少し制約する必要があります。

試行する前に、必ずデータベース全体をバックアップしてください。プロセスが問題なく機能するまで、非実稼働データベースで作業することをお勧めします。

3

Product_idがそのテーブルの一意の列である場合、CSVを使用してそれを行うことができます。

  1. 一意のIDでインポートしたいもののCSVファイルを用意します。 CSVファイルはテーブル列と同じ順序である必要があります。すべての列を入力し、列名は入力しないでください

  2. 次に、phpMyAdminで、データベースのテーブルに移動し、[インポート]をクリックします

  3. [形式]フィールドのドロップダウンで[CSV]を選択します

  4. 「インポート時に重複キーが見つかったときにデータを更新する(DUPLICATE KEY UPDATEで追加)」がチェックされていることを確認します。

image

3
Felix Labayen