Chỉ mục duy nhất trong Postgres dựa trên các giá trị bằng nhau , nhưng NULL không bao giờ bằng bất cứ thứ gì, kể cả các NULL khác. Do đó, bất kỳ hàng nào có giá trị NULL delete_at đều khác biệt với bất kỳ hàng nào khác có thể có - vì vậy bạn có thể chèn bất kỳ số nào trong số chúng.
Một cách giải quyết vấn đề này là tạo chỉ mục từng phần , áp dụng các quy tắc khác nhau cho các hàng có và không có NULL:
CREATE UNIQUE INDEX ... ON subscriptions
(user_id, class_type_id) WHERE deleted_at IS NULL;
CREATE UNIQUE INDEX ... ON subscriptions
(user_id, class_type_id, deleted_at) WHERE deleted_at IS NOT NULL;