44

私はこのようなテーブルを持っています:

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をループし、1行ごとに更新を実行することでこれを行う方法を知っていますが、これは非効率的なようです。

4

3 に答える 3

120

LOAD DATA INFILE800,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;
于 2012-04-20T21:25:46.017 に答える
5

更新データを別のテーブルにロードし、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

于 2012-04-20T21:23:15.593 に答える
1

@ ike-walkerからの回答は確かに正しいですが、CSVデータがフォーマットされているかどうかを再確認することも忘れないでください。多くの場合、たとえばCSVファイルでは、文字列フィールドを二重引用符で囲み、Windowsで作業している場合"はで終わる行を含めることができます。 デフォルトでは、囲み文字は使用されておらず、行末は。であると想定されています。詳細と例はこちらhttps://mariadb.com/kb/en/importing-data-into-mariadb/\r\n
\n

FIELDSこれは、およびの追加オプションを使用して修正できます。LINES

CREATE TEMPORARY TABLE your_temp_table LIKE your_table;

LOAD DATA INFILE '/tmp/your_file.csv'
INTO TABLE your_temp_table
FIELDS 
   TERMINATED BY ','            
   OPTIONALLY ENCLOSED BY '"'    -- new option
LINES TERMINATED BY '\r\n'       -- new option

(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;
于 2020-09-18T23:10:38.380 に答える