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は個別文よりも大幅に高速です:
- ラウンドトリップの削減 -- N文の代わりに1文
- 単一パース -- データベースがSQLテンプレートを一度だけ解析
- バルクログ -- トランザクションログが1操作を記録
- インデックス更新 -- インデックスがバッチで更新される
データベースの制限
ほとんどのデータベースは単一INSERTの値数に制限があります。MySQLはデフォルトで1MBのパケットサイズ(max_allowed_packet)、PostgreSQLには行数のハード制限はありませんがプリペアドステートメントでは約1000パラメータが実用的な上限です。コンバーターは大きな配列をチャンク分割されたINSERT文に分割できます。
ユースケース
JSONエクスポートファイル(MongoDBコレクションダンプやAPI一括レスポンスなど)をPostgreSQLやMySQLにインポートする際、マルチロウINSERTは行ごとの挿入と比較してインポート時間を大幅に短縮します。このパターンはETLパイプラインとデータ移行スクリプトに不可欠です。