Tạo một ràng buộc ĐỘC ĐÁO từ một đối tượng JSON


8

Hãy lấy một số người trong bảng ví dụ, chỉ có 2 trường: id và dữ liệu (json).

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

Tôi muốn tạo ràng buộc cho trường "pos", đó phải là duy nhất. Tôi đã tìm kiếm trên internet về các ràng buộc JSON nhưng không có kết quả.

Làm thế nào tôi có thể xử lý vấn đề này?


6
JSON được sử dụng cho dữ liệu không có cấu trúc, không có cấu trúc. Nếu bạn muốn các ràng buộc, bạn nên bình thường hóa dữ liệu của mình.
a_horse_with_no_name

5
'Bình thường hóa, bình thường hóa, bình thường hóa!' (VI dezso)
dezso

Câu trả lời:


16

Đầu tiên và quan trọng nhất: Tôi đồng ý với cả hai nhận xét của @a_horse_with_no_name và @dezso: bạn nên bình thường hóa dữ liệu của mình . JSON không dành cho điều đó.

Tuy nhiên, nếu một số lý do tôi không thể hiểu được thực sự làm cho điều này trở thành một lợi thế, thì có thể:

Tạo một biểu thức dựa trênUNIQUE INDEX :

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

Nếu tại thời điểm này, bạn cố gắng chèn đoạn dữ liệu sau vào bảng của mình (đã có sẵn - >> pos):

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

Bạn nhận được điều này như là một phản ứng:

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

LƯU Ý: Tôi đã giả định rằng data.possẽ luôn luôn là một chuỗi. Nếu bạn muốn khái quát hóa, bạn có thể sử dụng ( (data->'pos') )thay thế. Bạn sẽ lập chỉ mục sau đó một biểu thức JSON (B) thay vì văn bản. Kiểm tra các hàm và toán tử JSON .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.