Создание уникального ограничения из объекта JSON

8

Давайте рассмотрим несколько примеров таблиц людей, которые получили только 2 поля: id и data (json).

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

Я хочу создать ограничение для поля "pos", которое должно быть уникальным. Я искал в интернете ограничения JSON, но безрезультатно.

Как я могу справиться с этой проблемой?

Chenko47
источник
6
JSON используется для неструктурированных неструктурированных данных. Если вы хотите ограничения, вы должны правильно нормализовать ваши данные.
a_horse_with_no_name
5
«Нормализуй, нормализуй, нормализуй!» (VI dezso)
dezso

Ответы:

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 функции и операторы .

joanolo
источник