mysql - 导入 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将 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;

https://stackoverflow.com/questions/10253605/

相关文章:

sql - MySQL为每一行自动存储日期时间

mysql - 如何选择几个硬编码的 SQL 行?

sql - SQL UPDATE中的str_replace?

java - Hibernate JPA、MySQL 和 TinyInt(1) 用于 boolean

java - 无法让spring boot自动创建数据库模式

c# - 在 Microsoft Visual Studio 2013 的 WinForms 中启用

mysql - 如何从 windows 命令提示符连接到 mysql 命令行

mysql - 让 MySQL 用户创建数据库,但只允许访问他们自己的数据库

python - 如何在 Python 中使用列名检索 SQL 结果列值?

mysql - 删除时间戳早于 x 天的所有行