JSON配列をマルチロウINSERT文に変換する

JSONオブジェクトの配列をマルチロウSQL INSERT文に変換する方法を学びます。バッチVALUES構文、カラム整列、キーが不揃いな配列の処理を解説します。

Basic INSERT

詳細な説明

JSON配列からマルチロウINSERTへ

JSONにオブジェクトの配列が含まれる場合、複数のVALUESタプルを持つ単一のINSERT文を生成できます。データベースがクエリを一度だけ解析するため、個別のINSERT文よりも効率的です。

JSONの例

[
  { "id": 1, "name": "Alice", "email": "alice@example.com" },
  { "id": 2, "name": "Bob", "email": "bob@example.com" },
  { "id": 3, "name": "Charlie", "email": "charlie@example.com" }
]

生成されるSQL

INSERT INTO users (id, name, email) VALUES
  (1, 'Alice', 'alice@example.com'),
  (2, 'Bob', 'bob@example.com'),
  (3, 'Charlie', 'charlie@example.com');

カラム抽出

コンバーターは配列内のすべてのオブジェクトをスキャンし、統一されたカラム名のセットを構築します。これにより、一部のオブジェクトに他にないキーがある場合にも対応できます。欠落値はNULLで埋められます。

不揃いなキーの処理

[
  { "id": 1, "name": "Alice" },
  { "id": 2, "name": "Bob", "email": "bob@example.com" }
]
INSERT INTO users (id, name, email) VALUES
  (1, 'Alice', NULL),
  (2, 'Bob', 'bob@example.com');

パフォーマンス上の利点

マルチロウINSERTは個別文よりも大幅に高速です:

  1. ラウンドトリップの削減 -- N文の代わりに1文
  2. 単一パース -- データベースがSQLテンプレートを一度だけ解析
  3. バルクログ -- トランザクションログが1操作を記録
  4. インデックス更新 -- インデックスがバッチで更新される

データベースの制限

ほとんどのデータベースは単一INSERTの値数に制限があります。MySQLはデフォルトで1MBのパケットサイズ(max_allowed_packet)、PostgreSQLには行数のハード制限はありませんがプリペアドステートメントでは約1000パラメータが実用的な上限です。コンバーターは大きな配列をチャンク分割されたINSERT文に分割できます。

ユースケース

JSONエクスポートファイル(MongoDBコレクションダンプやAPI一括レスポンスなど)をPostgreSQLやMySQLにインポートする際、マルチロウINSERTは行ごとの挿入と比較してインポート時間を大幅に短縮します。このパターンはETLパイプラインとデータ移行スクリプトに不可欠です。

試してみる — JSON to SQL

フルツールを開く