PostgreSQL の JSON フィールドのデータを更新する
    
    Shihab Sikder
    2023年6月20日
    
    PostgreSQL
    PostgreSQL Update
    
- PostgreSQL の JSON データ型
- PostgreSQL の JSON フィールドに新しいキーと値のペアを挿入する
- 
          
            JSONB_SET()を使用して PostgreSQL の JSON フィールドの既存のデータを更新する
 
この記事では、PostgreSQL を使用した JSON フィールドの更新について説明します。
PostgreSQL の JSON データ型
PostgreSQL には、JSON と JSONB の 2つの JSON データ型があります。 次のデータが入力された次のテーブルがあるとします。
postgres=# select * from product;
 id | product |                      details
----+---------+---------------------------------------------------
  1 | PC1     | {"CPU": "4.1 GHz", "HDD": "2TB", "RAM": "16GB"}
  2 | PC2     | {"CPU": "3.1 GHz", "HDD": "1TB", "RAM": "8GB"}
  3 | PC3     | {"CPU": "2.5 GHz", "HDD": "2.5TB", "RAM": "32GB"}
  4 | PC4     | {"CPU": "3.5 GHz", "HDD": "2TB", "RAM": "64GB"}
  5 | PC5     | {"CPU": "2.8 GHz", "HDD": "2TB", "RAM": "4GB"}
(5 rows)
次のテーブルを作成するには、次の SQL クエリを実行します。
CREATE TABLE product (
  id INT,
  product VARCHAR,
  details JSONB
);
INSERT INTO product VALUES (1, 'PC1','{"CPU":"4.1 GHz", "RAM":"16GB", "HDD":"2TB"}');
INSERT INTO product VALUES (1, 'PC2','{"CPU":"3.1 GHz", "RAM":"8GB", "HDD":"1TB"}');
INSERT INTO product VALUES (1, 'PC3','{"CPU":"2.5 GHz", "RAM":"32GB", "HDD":"2.5TB"}');
INSERT INTO product VALUES (1, 'PC4','{"CPU":"3.5 GHz", "RAM":"64GB", "HDD":"2TB"}');
INSERT INTO product VALUES (1, 'PC5','{"CPU":"2.8 GHz", "RAM":"4GB", "HDD":"2TB"}');
PostgreSQL の JSON フィールドに新しいキーと値のペアを挿入する
ここで、テーブルの PC1 に GPU を追加するとします。 キーはGPU、値はRTX 3060になります。
これは、通常の UPDATE クエリのように UPDATE コマンドを使用して挿入できます。
構文:
UPDATE table_name
SET json_field_name = json_field_name || new_key_value
|| operator は、新しい JSON オブジェクトを前のものと連結します。 ここで、{"GPU":"RTX 3060"} を PC1 に挿入するには、SQL クエリは次のようになります。
UPDATE product
SET details = details || '{"GPU":"RTX 3060"}'
WHERE product='PC1';
これで、テーブルは次のようになります。
postgres=# select * from product;
 id | product |                              details
----+---------+--------------------------------------------------------------------
  2 | PC2     | {"CPU": "3.1 GHz", "HDD": "1TB", "RAM": "8GB"}
  3 | PC3     | {"CPU": "2.5 GHz", "HDD": "2.5TB", "RAM": "32GB"}
  4 | PC4     | {"CPU": "3.5 GHz", "HDD": "2TB", "RAM": "64GB"}
  5 | PC5     | {"CPU": "2.8 GHz", "HDD": "2TB", "RAM": "4GB"}
  1 | PC1     | {"CPU": "4.1 GHz", "GPU": "RTX 3060", "HDD": "2TB", "RAM": "16GB"}
(5 rows)
PC1 が新しいキー値 "GPU": "RTX 3060" を取得したことがわかります。
JSONB_SET() を使用して PostgreSQL の JSON フィールドの既存のデータを更新する
PC1 プロセッサを Ryzen 9 に更新するように依頼されたとします。 JSON データ型の既存の値を変更するには、JSONB_SET() メソッドを使用する必要があります。
JSON データ型の列、キー、値の 3つのパラメーターを使用します。 したがって、PC1 の CPU を Ryzen 9 で更新するには、次のクエリを実行する必要があります。
UPDATE product
SET details = JSONB_SET(details,'{CPU}','"Ryzen 9"')
WHERE product='PC1';
更新後、テーブルには次のデータが含まれます。
postgres=# select * from product;
 id | product |                              details
----+---------+--------------------------------------------------------------------
  2 | PC2     | {"CPU": "3.1 GHz", "HDD": "1TB", "RAM": "8GB"}
  3 | PC3     | {"CPU": "2.5 GHz", "HDD": "2.5TB", "RAM": "32GB"}
  4 | PC4     | {"CPU": "3.5 GHz", "HDD": "2TB", "RAM": "64GB"}
  5 | PC5     | {"CPU": "2.8 GHz", "HDD": "2TB", "RAM": "4GB"}
  1 | PC1     | {"CPU": "Ryzen 9", "GPU": "RTX 3060", "HDD": "2TB", "RAM": "16GB"}
(5 rows)
CPU が正常に更新されたことがわかります。
JSONB_SET() を使用する場合、次のことを確認する必要があります。
- 最初のパラメーターは、JSON データ型の列になります。
- 2 番目のパラメーターは、中括弧 (単一引用符内) で囲まれたキー名になります。
- 3 番目のパラメーターは、一重引用符で囲まれた更新された値になります。
PostgreSQL の JSON データ型の詳細については、このブログ を参照してください。 また、公式ドキュメント にアクセスすることもできます。
        チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe
    
著者: Shihab Sikder
    
