2012-04-20 67 views
41

专栏中,我有一个表,看起来像这样:导入CSV只更新一个表

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

大约有此表800000项。我已经收到了更新所有每个产品的数量的一个新的CSV文件,例如:

productA, 12 
productB, 71 
productC, 92 

因此,有向大约75万次的更新(50,000产品已经在数量上没有变化)。

我的问题是,如何导入CSV这个只更新基于关闭的product(唯一)的数量,而是独自离开skudepartment等领域?我知道如何通过循环遍历CSV并为每一行执行更新来实现这一点,但这似乎效率低下。

回答

108

您可以使用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; 
+4

真棒 - 那是一个真正成熟的答案! – DocJones 2012-04-20 21:34:22

+2

+1为最简单和点答案。 – diEcho 2013-03-15 06:55:03

+0

@lke沃克,你能回答我这个问题吗?http://stackoverflow.com/questions/21495600/import-csv-to-update-rows-in-table – 2014-02-01 07:57:56

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