Unikalne indeksy w Postgresie są oparte na wartościach, które są równe , ale NULL nigdy nie jest równy niczemu, łącznie z innymi wartościami NULL. Dlatego każdy wiersz o wartości NULL delete_at różni się od każdego innego możliwego wiersza - możesz więc wstawić dowolną ich liczbę.
Jednym ze sposobów na obejście tego jest tworzenie częściowych indeksów , stosując różne reguły do wierszy z wartościami NULL i bez nich:
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;