Tạo một UNIQUE
chỉ mục nhiều cột trên (product_id, variant_id)
:
CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);
Tuy nhiên, điều này sẽ cho phép nhiều mục nhập (1, NULL)
cho (product_id, variant_id)
bởi vì NULL
các giá trị không được coi là giống hệt nhau.
Để bù đắp điều đó, hãy tạo thêm một phần UNIQUE
lập chỉ mục trên product_id
:
CREATE UNIQUE INDEX line_items_prod_var_null_idx ON line_items (product_id)
WHERE variant_id IS NULL;
Bằng cách này, bạn có thể nhập (1,2)
, (1,3)
và (1, NULL)
, nhưng cả hai đều không có lần thứ hai. Đồng thời tăng tốc các truy vấn với các điều kiện trên một hoặc cả hai cột.
Câu trả lời gần đây, có liên quan trên dba.SE, gần như áp dụng trực tiếp cho trường hợp của bạn:
- Ràng buộc duy nhất nhiều cột của PostgreSQL và các giá trị NULL