it-swarm.com.de

Erstellen einer EINZIGARTIGEN Einschränkung aus einem JSON-Objekt

Nehmen wir einige Beispieltabellen, die nur zwei Felder haben: id und data (json).

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

Ich möchte eine Einschränkung für das Feld "pos" erstellen, die eindeutig sein muss. Ich habe über das Internet nach JSON-Einschränkungen gesucht, aber keine Ergebnisse.

Wie kann ich mit diesem Problem umgehen?

8
Chenko47

In erster Linie: Ich stimme sowohl den Kommentaren von @a_horse_with_no_name als auch von @dezso zu: Sie sollten Ihre Daten normalisieren . JSON ist dafür nicht.

Wenn jedoch ein Grund, den ich nicht ergründen kann, dies wirklich zu einem Vorteil macht, ist es möglich:

Erstellen Sie ein Ausdruck basierend auf UNIQUE INDEX :

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

Wenn Sie zu diesem Zeitpunkt versuchen, die folgenden Daten in Ihre Tabelle einzufügen (mit einer bereits vorhandenen - >> pos):

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

Sie erhalten dies als Antwort:

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

HINWEIS: Ich habe angenommen, dass data.pos Immer eine Zeichenfolge ist. Wenn Sie verallgemeinern möchten, können Sie stattdessen ( (data->'pos') ) Verwenden. Sie würden dann einen JSON (B) -Ausdruck anstelle eines Textes indizieren. Überprüfen Sie JSON-Funktionen und Operatoren .

15
joanolo