Creazione di un vincolo UNIQUE da un oggetto JSON


8

Prendiamo alcuni esempi di persone di tabella, che ha ottenuto solo 2 campi: id e data (json).

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

Voglio creare un vincolo per il campo "pos", che deve essere unico. Ho cercato su Internet i vincoli JSON ma nessun risultato.

Come posso gestire questo problema?


6
JSON viene utilizzato per dati non strutturati e non strutturati. Se vuoi vincoli, dovresti normalizzare correttamente i tuoi dati.
a_horse_with_no_name

5
"Normalizza, normalizza, normalizza!" (VI dezso)
dezso

Risposte:


17

Innanzitutto: concordo con entrambi i commenti di @a_horse_with_no_name e @dezso: dovresti normalizzare i tuoi dati . JSON non è per quello.

Tuttavia, se qualche motivo che non riesco a capire davvero lo rende un vantaggio, è possibile:

Crea un'espressione basataUNIQUE INDEX :

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

Se, a questo punto, si tenta di inserire i seguenti dati nella tabella (con un pos già esistente - >>):

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

Ottieni questo come risposta:

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

NOTA: ho assunto che data.possarà sempre una stringa. Se vuoi generalizzare, puoi usare ( (data->'pos') )invece. Indicizzeresti quindi un'espressione JSON (B) anziché un testo. Controllare le funzioni e gli operatori JSON .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.