PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres Unique Constraint erzwingt keine Eindeutigkeit

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;