Eindeutige Indizes in Postgres basieren auf gleichen Werten , aber NULL ist niemals gleich irgendetwas, einschließlich anderer NULL-Werte. Daher unterscheidet sich jede Zeile mit einem NULL-Deleted_at-Wert von jeder anderen möglichen Zeile – Sie können also beliebig viele davon einfügen.
Eine Möglichkeit, dies zu umgehen, besteht darin, Teilindizes zu erstellen , Anwenden unterschiedlicher Regeln auf Zeilen mit und ohne 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;