导入CSV以仅更新表中的一列

我有一个如下所示的表格:

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

这个表中大约有800,000个条目。 我收到了一个新的CSV文件,用于更新每个产品的所有数量,例如:

 productA, 12 productB, 71 productC, 92 

所以有大约750,000次更新(50,000个产品没有数量变化)。

我的问题是,如何导入此CSV来仅更新基于product (独特)的数量,但将skudepartment和其他字段单独保留? 我知道如何在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