web-dev-qa-db-ja.com

CSVをインポートして、テーブル内の1つの列のみを更新する

次のような表があります。

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

このテーブルには約800,000のエントリがあります。たとえば、各製品のすべての数量を更新する新しいCSVファイルを受け取りました。

productA, 12
productB, 71
productC, 92

そのため、約750,000の更新があります(50,000の製品には数量の変更はありませんでした)。

私の質問は、このCSVをインポートして、product(一意)に基づく数量のみを更新し、skudepartment、およびその他のフィールドはそのままにしておく方法です。私はPHPでCSVをループして各行ごとに更新を実行することでこれを行う方法を知っていますが、これは非効率的なようです。

43
Ryan Kempt

LOAD DATA INFILE 800,000行のデータを一時テーブルに一括ロードし、複数テーブル UPDATE 構文を使用して既存のテーブルを一時テーブルに結合し、数量を更新します。値。

例えば:

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

更新データを別のテーブルUPDATE_TABLEにロードし、次を使用してMySQL内で更新を実行します。

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

現在MySQLを手元に持っていないので、構文を完全に確認できます。LIMIT 0,1を内部SELECTに追加する必要があるかもしれません。

5
DocJones