【问题标题】:Import CSV to Update rows in table导入 CSV 以更新表中的行
【发布时间】:2014-02-25 01:32:48
【问题描述】:

大约有 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 行?

输出示例:

我知道如何在 PHP 中通过循环遍历 CSV 并为每个产品选择和执行更新来做到这一点,但这似乎效率低下。

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

【问题讨论】:

    标签: mysql csv import phpmyadmin


    【解决方案1】:

    您可以将新数据导入另一个表 (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
    

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

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

    【讨论】:

    • 请查看销售价格不是列名。它是 meta_key 列的值。
    • 查询只是一个例子
    【解决方案2】:

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

    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;
    

    【讨论】:

    • 我不认为,您的解决方案会奏效。请仔细看。我在 CSV 文件中有 sku 值和销售价格,这些是值,而不是列名。此内部连接不起作用。
    • 你说_sku = meta_key,假设是CSV中的SKU = meta_key。如果不是这样,您需要以更易读的方式指定 csv 和 table 之间的关系(即 csv 和 table 使用相同的列名)
    • 您缺少临时表中列的数据类型。
    【解决方案3】:

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

    1. 拥有一个 CSV 文件,其中包含您要导入的人员及其唯一 ID。 CSV文件必须与表格列的顺序相同,把你所有的列都放上,没有列名

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

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

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

    【讨论】:

      【解决方案4】:

      在我看来,rAndom69 的答案在 postgresql 12 上不起作用,但加入 WHERE 起作用:

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

      【讨论】:

        猜你喜欢
        • 2012-05-02
        • 1970-01-01
        • 2015-09-03
        • 1970-01-01
        • 2013-10-08
        • 2012-10-28
        • 1970-01-01
        • 2016-07-21
        • 1970-01-01
        相关资源
        最近更新 更多