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)で提案された値を参照します。
使い方
- ON CONFLICTオプションを「Upsert (DO UPDATE)」に設定
- コンフリクトカラムを選択(通常はプライマリキーまたはユニーク制約カラム)
- その他すべてのカラムがUPDATE SET句にリストされます
Upsertを使うべきとき
- データ同期: 既存レコードを含む可能性のある外部ソースからデータをインポート
- 冪等スクリプト: 安全に再実行できる移行スクリプト
- 増分インポート: 既存レコードと重複する日次データフィード
ユースケース
毎日の商品カタログ更新をJSONファイルで受け取る場合。Upsertを使用することで、インポートスクリプトが既存の商品(SKUでマッチング)を安全に更新し、新しい商品を挿入するため、インポートが冪等になります。