导入CSV以更新表中的行

时间:2014-02-01 07:55:12

标签: mysql csv import phpmyadmin

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

enter image description here

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

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

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

输出示例:

enter image description here

我知道如何在PHP中循环使用CSV并选择&为每个产品执行更新,但这似乎效率低下。

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

4 个答案:

答案 0 :(得分:32)

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

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;

答案 1 :(得分:3)

您可以将新数据导入另一个表(table2)。然后使用带有子选择的更新来更新主表(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

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

确保在尝试之前备份完整的数据库。我建议您在非生产数据库上工作,直到该过程完美无缺。

答案 2 :(得分:2)

如果product_id是该表的唯一列,则可以使用CSV来做到这一点:

  1. 具有要导入的CSV文件及其唯一ID。 CSV文件必须与表格列的顺序相同,并放置所有列且没有列名

  2. 然后在phpMyAdmin中,转到数据库表,单击import

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

  4. 确保选中“在导入时发现重复的密钥时进行数据更新(添加重复密钥更新)。”

image

答案 3 :(得分:0)

在我看来,rAndom69的答案不适用于postgresql 12,但可以与WHERE结合使用:

UPDATE tableA
SET fieldToPopulateInTableA = temp_update_table.fieldPopulated
FROM temp_update_table 
WHERE tableA.correspondingField = temp_update_table.correspondingField