大约有26K个产品(帖子),每个产品都有这样的元值:
post_id列是db中的产品ID,_sku(meta_key)是每个产品的唯一ID。
我收到了一个新的CSV文件,用于更新每个产品的_sale_price(meta_key)的所有值(meta_value)。 CSV文件如下所示:
SKU,促销价
如何导入此CSV以仅根据post_id(产品ID)&更新_sale_price行。 _sku值?
输出示例:
我知道如何在PHP中循环使用CSV并选择&为每个产品执行更新,但这似乎效率低下。
最好使用phpMyAdmin并使用LOAD DATA INFILE。
答案 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来做到这一点:
具有要导入的CSV文件及其唯一ID。 CSV文件必须与表格列的顺序相同,并放置所有列且没有列名
然后在phpMyAdmin中,转到数据库表,单击import
在“格式”字段的下拉列表中选择CSV
确保选中“在导入时发现重复的密钥时进行数据更新(添加重复密钥更新)。”
答案 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