54

膨大な量のデータを MySQL にロードするには、LOAD DATA INFILEが断然最速のオプションです。残念ながら、これは INSERT IGNORE または REPLACE が機能する方法で使用できますが、ON DUPLICATE KEY UPDATE は現在サポートされていません。

ただし、ON DUPLICATE KEY UPDATEに比べて利点がありREPLACEます。後者は、重複が存在する場合に削除と挿入を行います。これにより、キー管理のオーバーヘッドが生じます。また、自動インクリメント ID は置換時に同じままではありません。

ON DUPLICATE KEY UPDATELOAD DATA INFILE を使用する場合、どのようにエミュレートできますか?

4

2 に答える 2

104

次の手順を使用して、この機能をエミュレートできます。

  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 FROMと、SHOW COLUMNS FROMこのプロセスは任意のテーブルに対して自動化できます。

于 2013-03-07T12:25:45.543 に答える
5

Jan が共有する回答で、最初 (2 つのステップ) を以下の単一のクエリに置き換えることができます。

ステップ 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;
    
于 2017-09-06T10:33:27.293 に答える