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を使用することで、手動の重複排除なしにデータを最新の状態に保てます。

試してみる — JSON to Bulk INSERT

フルツールを開く