【问题标题】:MySQL LOAD DATA INFILE with ON DUPLICATE KEY UPDATEMySQL LOAD DATA INFILE 与 ON DUPLICATE KEY UPDATE
【发布时间】:2018-05-22 08:34:24
【问题描述】:

对于将大量数据加载到 MySQL 中,LOAD DATA INFILE 是迄今为止最快的选择。不幸的是,虽然这可以用于 INSERT IGNORE 或 REPLACE 的工作方式,但目前不支持 ON DUPLICATE KEY UPDATE。

但是,ON DUPLICATE KEY UPDATEREPLACE 具有优势。后者在存在重复项时执行删除和插入。这为密钥管理带来了开销。此外,自动增量 ID 在替换时不会保持不变。

使用 LOAD DATA INFILE 时如何模拟ON DUPLICATE KEY UPDATE

【问题讨论】:

    标签: mysql load-data-infile on-duplicate-key


    【解决方案1】:

    这些步骤可用于模拟此功能:

    1. 创建一个新的临时表。

      CREATE TEMPORARY TABLE temporary_table LIKE target_table;
      
    2. (可选)从临时表中删除所有索引以加快处理速度。

      SHOW INDEX FROM temporary_table;
      DROP INDEX `PRIMARY` ON temporary_table;
      DROP INDEX `some_other_index` ON temporary_table;
      
    3. 将 CSV 加载到临时表中

      LOAD DATA INFILE 'your_file.csv'
      INTO TABLE temporary_table
      FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
      (field1, field2);
      
    4. 使用 ON DUPLICATE KEY UPDATE 复制数据

      SHOW COLUMNS FROM target_table;
      INSERT INTO target_table
      SELECT * FROM temporary_table
      ON DUPLICATE KEY UPDATE field1 = VALUES(field1), field2 = VALUES(field2);
      
    5. 删除临时表

      DROP TEMPORARY TABLE temporary_table;
      

    使用SHOW INDEX FROMSHOW COLUMNS FROM 可以为任何给定的表自动执行此过程。

    【讨论】:

    • 我建议使用INSERT INTO target_table SELECT coloumn_name1, coloumn_name1 FROM temporary_table,因为 * 将包含主键并导致主表中具有相同主键(在 auto_increment 主键的情况下)的项目被更新,否则这个为我工作!
    • 感谢您的回答,经过一些 SQL 杂耍后为我工作。我的 SQL-fu 很生疏,很高兴学习这种巧妙的技术。
    • 这里也非常感谢 - 工作出色 - 认为不可能使用 LOAD DATA INFILE 执行 ON DUPLICATE KEY,所以以前从未尝试过。
    • @verisimilitude - 删除索引将提高从文件加载数据的性能!
    • 步骤 1) 和 2) 可以在一个语句中完成:CREATE TEMPORARY TABLE temporary_table SELECT * FROM target_table LIMIT 0;
    【解决方案2】:

    我们可以用the answer shared by Jan中的以下单个查询替换第一个(两步)。

    对于第 1 步和第 2 步,我们可以创建具有相同引用结构且没有任何索引的新表。

    CREATE TEMPORARY TABLE temporary_table SELECT * FROM target_table WHERE 1=0;
    

    代替。

    1. 创建一个新的临时表。

      CREATE TEMPORARY TABLE temporary_table LIKE target_table;
      
    2. (可选)从临时表中删除所有索引以加快处理速度。

      SHOW INDEX FROM temporary_table;
      DROP INDEX `PRIMARY` ON temporary_table;
      DROP INDEX `some_other_index` ON temporary_table;
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多