导入CSV以仅更新表中的一列
我有一个如下所示的表格:
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
将80万行数据批量加载到临时表中,然后使用多表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,所以我可以完美地检查语法,可能需要在内部SELECT
添加一个LIMIT 0,1
。