JSONパッチデータからSQL UPDATE文を生成する
JSONオブジェクトをSQL UPDATE文に変換する方法を学びます。部分更新、WHERE句の生成、条件付きSET式、ネストされた更新ペイロードの処理を解説します。
Advanced Patterns
詳細な説明
JSONからSQL UPDATEへ
すべてのJSON-to-SQL変換がINSERT操作とは限りません。既存レコードへの変更を表す部分的なJSONオブジェクトを受信した場合、代わりにUPDATE文が必要です。
JSONの例(部分更新)
{
"id": 42,
"name": "Alice Johnson",
"email": "alice.johnson@newdomain.com",
"score": 99
}
生成されるSQL
UPDATE users SET
name = 'Alice Johnson',
email = 'alice.johnson@newdomain.com',
score = 99
WHERE id = 42;
WHERE句の識別
コンバーターはどのフィールドが行を識別するかを知る必要があります。一般的な戦略:
- 主キーフィールド -- デフォルトで
idを使用 - ユーザー指定キー -- WHEREカラムをユーザーに選択させる
- 複合キー -- 複数フィールドを使用(
WHERE user_id = 1 AND date = '2024-06-15')
SETからキーを除外
WHEREカラムはSET句に表示されるべきではありません:
-- 間違い:idがSETとWHEREの両方にある
UPDATE users SET id = 42, name = 'Alice' WHERE id = 42;
-- 正しい:idはWHEREのみ
UPDATE users SET name = 'Alice' WHERE id = 42;
更新でのNull処理
{ "id": 42, "bio": null, "phone": null }
UPDATE users SET bio = NULL, phone = NULL WHERE id = 42;
カラムをNULLに設定することは、オプションフィールドをクリアするための有効で一般的な操作です。
JSON配列からのバッチ更新
[
{ "id": 1, "score": 95 },
{ "id": 2, "score": 87 },
{ "id": 3, "score": 92 }
]
UPDATE users SET score = 95 WHERE id = 1;
UPDATE users SET score = 87 WHERE id = 2;
UPDATE users SET score = 92 WHERE id = 3;
UPDATE vs UPSERT
| シナリオ | 文 |
|---|---|
| 行が確実に存在する | UPDATE |
| 行が存在するかもしれない | INSERT ... ON CONFLICT ... DO UPDATE |
| 行が存在してはならない | INSERT(ユニーク制約付き) |
条件付き更新
より複雑なロジックの場合、コンバーターはCASE式を生成できます:
UPDATE users SET
score = CASE
WHEN id = 1 THEN 95
WHEN id = 2 THEN 87
WHEN id = 3 THEN 92
END
WHERE id IN (1, 2, 3);
これはすべての更新を単一の文で実行するため、個別のUPDATE文よりも効率的です。
ユースケース
フロントエンドアプリケーションがユーザープロファイルを更新するためにJSON PATCHペイロードを送信する際、バックエンドは変更されたフィールドのみを修正するUPDATE文を生成する必要があります。自動化されたJSON-to-UPDATE変換により、正しいSET句の生成が保証され、偶発的なデータ上書きが防止されます。