Crear una restricción ÚNICA a partir de un objeto JSON

8

Tomemos algunos ejemplos de pueblos de tabla, que obtuvieron solo 2 campos: id y data (json).

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

Quiero crear una restricción para el campo "pos", que debe ser único. He buscado en Internet sobre las restricciones de JSON, pero no hay resultados.

¿Cómo puedo manejar este problema?

Chenko47
fuente
66
JSON se usa para datos sin estructura y sin esquema. Si desea restricciones, debe normalizar adecuadamente sus datos.
a_horse_with_no_name
55
'¡Normalizar, normalizar, normalizar!' (VI dezso)
dezso

Respuestas:

17

Primero y principal: estoy de acuerdo con los comentarios de @a_horse_with_no_name y @dezso: debe normalizar sus datos . JSON no es para eso.

Sin embargo, si alguna razón por la que no puedo entender realmente hace de esto una ventaja, es posible:

Crear una expresión basadaUNIQUE INDEX :

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

Si, en este punto, intenta insertar el siguiente dato en su tabla (con una ya existente - >> pos):

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

Obtienes esto como respuesta:

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

NOTA: Supuse que data.possiempre será una cadena. Si desea generalizar, puede usar ( (data->'pos') )en su lugar. Luego indexaría una expresión JSON (B) en lugar de un texto. Verifique las funciones y operadores de JSON .

joanolo
fuente