ON CONFLICT / ON DUPLICATE KEYによるUpsert

冪等なBulk INSERT文をUpsertロジックで生成します。PostgreSQLのON CONFLICT DO UPDATE、MySQLのON DUPLICATE KEY UPDATE、SQLiteのサポートを解説します。

Advanced

詳細な説明

Upsertによる冪等Bulkインサート

Upsert(INSERTまたはUPDATE)はBulkインポートを冪等にします — 何度実行しても同じ結果が得られます。ツールはダイアレクト固有のUpsert構文を生成します。

PostgreSQL:ON CONFLICT DO UPDATE

INSERT INTO "products" ("sku", "name", "price", "stock")
VALUES
  ('SKU-001', 'Laptop', 999.99, 50),
  ('SKU-002', 'Mouse', 29.99, 200),
  ('SKU-003', 'Monitor', 599.99, 30)
ON CONFLICT ("sku") DO UPDATE SET
  "name" = EXCLUDED."name",
  "price" = EXCLUDED."price",
  "stock" = EXCLUDED."stock";

EXCLUDED擬似テーブルは、挿入しようとした値へのアクセスを提供します。

MySQL:ON DUPLICATE KEY UPDATE

INSERT INTO \`products\` (\`sku\`, \`name\`, \`price\`, \`stock\`)
VALUES
  ('SKU-001', 'Laptop', 999.99, 50),
  ('SKU-002', 'Mouse', 29.99, 200)
ON DUPLICATE KEY UPDATE
  \`name\` = VALUES(\`name\`),
  \`price\` = VALUES(\`price\`),
  \`stock\` = VALUES(\`stock\`);

MySQLはVALUES(column_name)で提案された値を参照します。

使い方

  1. ON CONFLICTオプションを「Upsert (DO UPDATE)」に設定
  2. コンフリクトカラムを選択(通常はプライマリキーまたはユニーク制約カラム)
  3. その他すべてのカラムがUPDATE SET句にリストされます

Upsertを使うべきとき

  • データ同期: 既存レコードを含む可能性のある外部ソースからデータをインポート
  • 冪等スクリプト: 安全に再実行できる移行スクリプト
  • 増分インポート: 既存レコードと重複する日次データフィード

ユースケース

毎日の商品カタログ更新をJSONファイルで受け取る場合。Upsertを使用することで、インポートスクリプトが既存の商品(SKUでマッチング)を安全に更新し、新しい商品を挿入するため、インポートが冪等になります。

試してみる — JSON to Bulk INSERT

フルツールを開く