【问题标题】:Import CSV to Update only one column in table导入 CSV 以仅更新表中的一列
【发布时间】:2012-05-02 11:23:13
【问题描述】:

我有一张如下所示的表格:

products
--------
id, product, sku, department, quantity

此表中大约有 800,000 个条目。我收到了一个新的 CSV 文件,其中更新了每种产品的所有数量,例如:

productA, 12
productB, 71
productC, 92

因此大约有 750,000 次更新(50,000 种产品的数量没有变化)。

我的问题是,如何导入此 CSV 以仅更新基于 product(唯一)的数量,但不考虑 skudepartment 和其他字段?我知道如何在 PHP 中通过循环遍历 CSV 并为每一行执行更新来做到这一点,但这似乎效率低下。

【问题讨论】:

    标签: mysql csv import


    【解决方案1】:

    我会将更新数据加载到单独的表 UPDATE_TABLE 中并使用以下命令在 MySQL 中执行更新:

    UPDATE PRODUCTS P SET P.QUANTITY=(
        SELECT UPDATE_QUANTITY
        FROM UPDATE_TABLE
        WHERE UPDATE_PRODUCT=P.PRODUCT
    )
    

    我现在手头没有 MySQL,所以我可以完美地检查语法,可能你需要在内部 SELECT 中添加一个 LIMIT 0,1

    【讨论】:

      【解决方案2】:

      您可以使用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;
      

      【讨论】:

      • 太棒了 - 这是一个非常复杂的答案!
      • @lke Walker,你能回答我的这个问题吗stackoverflow.com/questions/21495600/…
      • 如果您愿意,可以使用 phpMyAdmin 的“导入”功能而不是“加载数据”部分,然后使用此答案的“更新”部分。
      • 有了上面的答案,临时表数据是否与主表数据不完全匹配有关系吗?因此,例如,如果 CSV 文件包含 50,000 行数据,但主表包含 200,000 行数据。这种方法会忽略列 id 上不匹配的行吗?另外,如果 CSV 文件包含新行怎么办?是否也可以使用上述函数以修改的方式添加新行?
      • 我使用 LOAD DATA LOCAL INFILE 发送到远程服务器(例如 Amazon RDS)
      【解决方案3】:

      @ike-walker 的回答确实是正确的,但也要记得仔细检查你的 CSV 数据是否格式化。很多时候,例如 CSV 文件可以包含用双引号 " 括起来的字符串字段,如果在 Windows 上工作,则行以 \r\n 结尾。
      默认情况下,假定不使用任何封闭字符,并且行尾为\n。 更多信息和示例在这里https://mariadb.com/kb/en/importing-data-into-mariadb/

      这可以通过使用 FIELDSLINES 的附加选项来解决

      CREATE TEMPORARY TABLE your_temp_table LIKE your_table;
      
      LOAD DATA INFILE '/tmp/your_file.csv'
      INTO TABLE your_temp_table
      FIELDS 
         TERMINATED BY ','            
         OPTIONALLY ENCLOSED BY '"'    -- new option
      LINES TERMINATED BY '\r\n'       -- new option
      
      (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;
      

      【讨论】:

        猜你喜欢
        • 2014-02-25
        • 2021-05-06
        • 1970-01-01
        • 2021-05-16
        • 2020-05-19
        • 1970-01-01
        • 2016-04-02
        • 2014-02-12
        • 2020-05-30
        相关资源
        最近更新 更多