さて、PostgreSQLのJSONBって、複雑な階層データを保存するのにめっちゃ便利なツールだよね。でも、もしJSONBカラムの中身を更新したいときはどうする?たとえば、ユーザーの電話番号を変えたり、配列に新しいカテゴリを追加したり。簡単そうだけど、JSONBはテーブルみたいにセルを直接書き換えるわけじゃない。データを更新するには専用の関数を使う必要があるんだ。今日は主役として:
jsonb_set(): 指定した「パス」に値を変更・追加するための関数。jsonb_insert(): JSON配列に新しい要素を挿入するための関数。
jsonb_set() でデータを更新する
jsonb_set() 関数は、JSONBオブジェクトの一部を変更したり、新しいキーや値を追加したりできるよ。
基本の構文
jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean)
target— 更新したいJSONBオブジェクト。path— 変更したいキーへのパスを表す文字列配列。new_value— 追加または置き換えたい値。create_missing— 足りないキーを作るかどうかのブール値(TRUEかFALSE)。
じゃあ、めっちゃシンプルな例を見てみよう。たとえば、users というテーブルがあって、profile というJSONBカラムにユーザープロフィールが入ってるとする。あるユーザーが電話番号を更新したいとき、どうやる?
-- テーブル作成とデータ追加
CREATE TABLE users (
id SERIAL PRIMARY KEY,
profile JSONB
);
INSERT INTO users (profile)
VALUES ('{"name": "オットー", "contact": {"phone": "+1-495-123-45-67"}}');
-- 電話番号を更新
UPDATE users
SET profile = jsonb_set(profile, '{contact,phone}', '"8-800-555-35-35"', FALSE)
WHERE id = 1;
-- 結果を確認
SELECT profile FROM users WHERE id = 1;
結果:
{
"name": "オットー",
"contact": {
"phone": "8-800-555-35-35"
}
}
やった!電話番号が変わったね!パスは '{contact,phone}' みたいに文字列配列で指定するのがポイント。
新しいキーを追加する
もし更新したいキーが存在しない場合は、create_missing = TRUE を使えば新しく作れるよ:
UPDATE users
SET profile = jsonb_set(profile, '{address,city}', '"ベルリン"', TRUE)
WHERE id = 1;
-- 結果を確認
SELECT profile FROM users WHERE id = 1;
結果:
{
"name": "オットー",
"contact": {
"phone": "8-800-555-35-35"
},
"address": {
"city": "ベルリン"
}
}
これで新しい住所セクションができた!便利だよね?
jsonb_insert() でデータを挿入する
jsonb_insert() 関数は、JSONBオブジェクト内の配列に要素を追加するために使うよ。
基本の構文
jsonb_insert(target jsonb, path text[], new_value jsonb, insert_after boolean)
target— 対象のJSONBオブジェクト。path— 要素を挿入したい配列へのパス。new_value— 追加したい値。insert_after— FALSEなら指定インデックスの前、TRUEなら後ろに挿入。
例を見てみよう。たとえば、profile カラムにユーザーの興味リストが入ってるとする。新しい興味を配列に追加したい場合:
-- サンプルデータを追加
UPDATE users
SET profile = jsonb_set(profile, '{interests}', '["スポーツ", "音楽"]', TRUE)
WHERE id = 1;
-- 新しい興味「プログラミング」をリストの先頭に挿入
UPDATE users
SET profile = jsonb_insert(profile, '{interests,0}', '"プログラミング"', FALSE)
WHERE id = 1;
-- 結果を確認
SELECT profile FROM users WHERE id = 1;
結果:
{
"name": "オットー",
"contact": {
"phone": "8-800-555-35-35"
},
"address": {
"city": "ベルリン"
},
"interests": [
"プログラミング",
"スポーツ",
"音楽"
]
}
よくあるトラブルとその回避法
jsonb_set() や jsonb_insert() を使うとき、以下のポイントに注意しないとちょっとハマることがあるよ:
- パスの指定ミス。 間違ったパスを指定したり、
create_missing=TRUEなしで存在しない要素を更新しようとすると、エラーになったり何も変わらなかったりする。JSONの構造はちゃんと確認しよう。 - データ型の不一致。
new_valueは必ずJSONB型じゃないとダメ。文字列を入れたいときは必ずダブルクォートで囲む('"値"'みたいに)。 - データの上書き。 配列をうっかり普通に更新しようとすると、前のデータが消えちゃうことも。新しい要素を安全に追加したいなら
jsonb_insert()を使おう。
エラー例:
-- エラー:パスが間違ってる
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"新しいコンタクト"', FALSE)
WHERE id = 1;
これは profile オブジェクトに contacts キーがなくて、create_missing がFALSEだからエラーになるよ。
回避方法:
-- create_missing = TRUE を指定
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"新しいコンタクト"', TRUE)
WHERE id = 1;
実際どんな場面で使うの?
JSONBを使いこなすのは、ただの遊びじゃなくて、今どきのアプリ開発では超重要なスキル!例えば:
- ユーザー設定の保存。 JSONBは、ユーザーごとに違うアプリ設定みたいな動的データ構造にピッタリ。
- 外部APIとの連携。 REST APIから返ってくる生のJSONデータを保存するのにも便利。
- ビッグデータ分析。 IoTデータやログ、アナリティクスみたいなネスト構造のデータも扱いやすい。
これでJSONオブジェクトの更新入門はおしまい!これからはJSONBにデータを挿入・更新・追加する方法や、よくあるミスの回避法もバッチリだね。次の講義では、JSONBオブジェクトの結合や、もっと効率的な使い方を紹介するよ!
GO TO FULL VERSION