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

Rya*_*mpt 43 mysql csv import

我有一个看起来像这样的表:

products
--------
id, product, sku, department, quantity
Run Code Online (Sandbox Code Playgroud)

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

productA, 12
productB, 71
productC, 92
Run Code Online (Sandbox Code Playgroud)

因此,大约有750,000个更新(50,000个产品的数量没有变化).

我的问题是,如何导入CSV这个只更新基于关闭的数量product(唯一的),但离开了sku,department独自一人,和其他领域?我知道如何通过循环CSV并为每一行执行更新来在PHP中执行此操作,但这似乎效率低下.

Ike*_*ker 116

您可以使用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;
Run Code Online (Sandbox Code Playgroud)

  • 太棒了 - 这是一个非常复杂的答案! (4认同)
  • 如果您愿意,可以使用phpMyAdmin的"导入"功能,而不是"LOAD DATA"部分,然后使用此答案的"UPDATE"部分. (2认同)

Doc*_*nes 5

我会将更新数据加载到单独的表中,UPDATE_TABLE并使用以下命令在MySQL中执行更新:

UPDATE PRODUCTS P SET P.QUANTITY=(
    SELECT UPDATE_QUANTITY
    FROM UPDATE_TABLE
    WHERE UPDATE_PRODUCT=P.PRODUCT
)
Run Code Online (Sandbox Code Playgroud)

我现在手头没有MySQL,所以我可以完美地检查语法,可能需要LIMIT 0,1在内部添加一个SELECT.