ON CONFLICT付きPostgreSQL Bulk INSERT
ダブルクォート識別子とON CONFLICT DO UPDATE SET構文によるUpsertをサポートするPostgreSQL互換のBulk INSERT文を生成します。
Dialect Differences
詳細な説明
PostgreSQL固有のBulk INSERT
PostgreSQLは主要データベースの中で最も柔軟なINSERT構文を提供しています。Bulk INSERTツールは、適切なクォートとコンフリクト処理を備えたイディオマティックなPostgreSQL出力を生成します。
PostgreSQL識別子のクォート
PostgreSQLは識別子にダブルクォートを使用します:
INSERT INTO "users" ("id", "first_name", "email")
VALUES
(1, 'Alice', 'alice@example.com'),
(2, 'Bob', 'bob@example.com');
ON CONFLICT構文
PostgreSQLのUpsertはON CONFLICT句を使用します:
DO NOTHING(重複をスキップ):
INSERT INTO "users" ("id", "name", "email")
VALUES
(1, 'Alice', 'alice@example.com')
ON CONFLICT ("id") DO NOTHING;
DO UPDATE SET(Upsert):
INSERT INTO "users" ("id", "name", "email")
VALUES
(1, 'Alice Updated', 'alice.new@example.com')
ON CONFLICT ("id") DO UPDATE SET
"name" = EXCLUDED."name",
"email" = EXCLUDED."email";
EXCLUDED擬似テーブルは挿入されるはずだった行を参照するため、UPDATE句で新しい値を簡単に参照できます。
PostgreSQLのBulk Insertにおける強み
- INSERT文あたりの実用的な行数制限なし
- JSONBサポート: ネストされたオブジェクトをJSONBカラムに格納可能
- COPYコマンド: 最高速度にはCSVとしてエクスポートして
COPYを使用 - 並列実行: 複数のバッチを並列トランザクションで実行可能
パフォーマンスのヒント
PostgreSQLでは、バッチサイズ500-1000が通常最適です。データベースが大きな文を効率的に処理するため、MySQLやSQLiteよりも大きなバッチを使用できます。
ユースケース
外部APIからJSONデータをPostgreSQLにロードしており、APIが重複レコードを返す可能性がある場合。ON CONFLICT DO UPDATEを使用することで、手動の重複排除なしにデータを最新の状態に保てます。