次のような表があります。
products
--------
id, product, sku, department, quantity
このテーブルには約800,000のエントリがあります。たとえば、各製品のすべての数量を更新する新しいCSVファイルを受け取りました。
productA, 12
productB, 71
productC, 92
そのため、約750,000の更新があります(50,000の製品には数量の変更はありませんでした)。
私の質問は、このCSVをインポートして、product
(一意)に基づく数量のみを更新し、sku
、department
、およびその他のフィールドはそのままにしておく方法です。私はPHPでCSVをループして各行ごとに更新を実行することでこれを行う方法を知っていますが、これは非効率的なようです。
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;
更新データを別のテーブル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
に追加する必要があるかもしれません。