JSONオブジェクトからのUNIQUE制約の作成


8

2つのフィールド(idとdata(json))しか持たないテーブルpeoplesの例をいくつか見てみましょう。

SELECT data FROM peoples ;
{"name": "Adam","pos":"DBA","age":22 }
{"name": "Alice","pos":"Security","age":33 }
{"name": "Bob","pos":"Manager","age":42 }

一意である必要がある「pos」フィールドの制約を作成したい。JSON制約についてインターネットで検索しましたが、結果はありませんでした。

この問題をどのように処理できますか?


6
JSONは、スキーマのない非構造化データに使用されます。制約が必要な場合は、データを適切に正規化する必要があります。
a_horse_with_no_name 2017年

5
「正規化、正規化、正規化!」(VI dezso)
dezso 2017年

回答:


17

何よりもまず、@ a_horse_with_no_nameと@dezsoの両方のコメントに同意しますデータを正規化する必要があります。JSONはそのためのものではありません

ただし、何らかの理由で私が理解できない理由で実際にこれを有利にした場合、それは可能です:

ベースUNIQUE INDEX式を作成します。

CREATE UNIQUE INDEX people_data_pos_idx ON peoples( (data->>'pos') ) ;

この時点で、次のデータを(既存の->> posを使用して)テーブルに挿入しようとすると、

INSERT INTO peoples(data)
VALUES
    ('{"name": "Eve", "pos":"DBA", "age":34}') ;

あなたはこれを応答として受け取ります:

ERROR: duplicate key value violates unique constraint "people_data_pos_idx"
SQL state: 23505
Detail: Key ((data ->> 'pos'::text))=(DBA) already exists.

注:私はそれdata.posが常に文字列であることを想定しています。一般化したい場合は、( (data->'pos') )代わりに使用できます。次に、テキストではなくJSON(B)式にインデックスを付けます。JSON関数と演算子を確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.