导入CSV以更新表中的行

Irf*_*fan 20 mysql csv import phpmyadmin

大约有26K产品(帖子),每个产品都有这样的元数值:

在此输入图像描述

post_id列是db中的产品ID,_sku(meta_key)是每个产品的唯一ID.

我收到了一个新的CSV文件,用于更新每个产品的_sale_price(meta_key)的所有值(meta_value).CSV文件如下所示:
SKU,销售价格

如何导入此CSV以仅根据post_id(产品ID)和_sku值更新_sale_price行?

输出示例:

在此输入图像描述

我知道如何通过循环CSV并为每个产品选择并执行更新来在PHP中执行此操作,但这似乎效率低下.

最好使用phpMyAdmin并使用LOAD DATA INFILE.

rAn*_*m69 34

您可以使用临时表来保存更新数据,然后运行单个更新语句.

CREATE TEMPORARY TABLE temp_update_table (meta_key, meta_value)

LOAD DATA INFILE 'your_csv_pathname' 
INTO TABLE temp_update_table FIELDS TERMINATED BY ';' (meta_key, meta_value); 

UPDATE "table"
INNER JOIN temp_update_table on temp_update_table.meta_key = "table".meta_key
SET "table".meta_value = temp_update_table.meta_value;

DROP TEMPORARY TABLE temp_update_table;
Run Code Online (Sandbox Code Playgroud)

  • 你说_sku = meta_key,假设是CSV = meta_key中的SKU.如果不是这样,您需要以更易读的方式指定csv和table之间的关系(即使用csv和table的相同列名) (3认同)

Fel*_*yen 5

如果 product_id 是该表的唯一列,则可以使用 CSV 执行此操作:

  1. 有一个 CSV 文件,其中包含要导入的文件及其唯一 ID。CSV 文件必须与表格列的顺序相同,放置所有列,不要列名

  2. 然后在phpMyAdmin中,进入数据库表,点击导入

  3. 在格式字段的下拉列表中选择 CSV

  4. 确保选中“在导入时发现重复键时更新数据(添加 DUPLICATE KEY UPDATE)”。

图片


Dav*_*ett 4

您可以将新数据导入到另一个表(表2)中。然后使用带有子选择的更新来更新主表(table1):

UPDATE table1 t1 set 
  sale_price = (select meta_value from table2 t2 where t2.post_id = t1.product_id)
WHERE
  (select count(*) from table2 t2 where t1.product_id = t2.post_id) > 0
Run Code Online (Sandbox Code Playgroud)

这显然是一种简化,您很可能需要进一步限制您的查询。

请确保在尝试之前备份完整数据库。我建议您使用非生产数据库,直到该过程完美运行。

  • 查询只是一个例子 (2认同)