PostgreSQL の JSON フィールドのデータを更新する

Shihab Sikder 2023年6月20日
  1. PostgreSQL の JSON データ型
  2. PostgreSQL の JSON フィールドに新しいキーと値のペアを挿入する
  3. JSONB_SET() を使用して PostgreSQL の JSON フィールドの既存のデータを更新する
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 フィールドに新しいキーと値のペアを挿入する

ここで、テーブルの PC1GPU を追加するとします。 キーは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つのパラメーターを使用します。 したがって、PC1CPURyzen 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() を使用する場合、次のことを確認する必要があります。

  1. 最初のパラメーターは、JSON データ型の列になります。
  2. 2 番目のパラメーターは、中括弧 (単一引用符内) で囲まれたキー名になります。
  3. 3 番目のパラメーターは、一重引用符で囲まれた更新された値になります。

PostgreSQL の JSON データ型の詳細については、このブログ を参照してください。 また、公式ドキュメント にアクセスすることもできます。

著者: Shihab Sikder
Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website

関連記事 - PostgreSQL Update