Прежде всего: я согласен с комментариями @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 функции и операторы .