Criando uma restrição UNIQUE a partir de um objeto JSON

8

Vamos dar um exemplo de povos da tabela, que possuem apenas 2 campos: 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 }

Quero criar restrição para o campo "pos", que deve ser exclusivo. Pesquisei na Internet sobre restrições de JSON, mas nenhum resultado.

Como posso lidar com esse problema?

Chenko47
fonte
6
JSON é usado para dados não estruturados e sem esquema. Se você deseja restrições, normalize seus dados corretamente.
precisa saber é o seguinte
5
'Normalize, normalize, normalize!' (VI dezso)
dezso

Respostas:

17

Em primeiro lugar: concordo com os comentários de @a_horse_with_no_name e @dezso: você deve normalizar seus dados . JSON não é para isso.

No entanto, se alguma razão pela qual eu não consigo entender realmente faz disso uma vantagem, é possível:

Crie uma expressão baseadaUNIQUE INDEX :

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

Se, nesse momento, você tentar inserir os seguintes dados em sua tabela (com um já existente - >> pos):

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

Você obtém isso como resposta:

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

NOTA: Presumi que data.possempre será uma string. Se você deseja generalizar, pode usar ( (data->'pos') ). Você indexaria então uma expressão JSON (B) em vez de um texto. Verifique as funções e operadores JSON .

joanolo
fonte