Unika index i Postgres bygger på att värden är lika , men NULL är aldrig lika med någonting, inklusive andra NULL. Därför skiljer sig alla rader med ett NULL deleted_at-värde från alla andra möjliga rader - så du kan infoga valfritt antal av dem.
Ett sätt att kringgå detta är att skapa partiella index , tillämpa olika regler på rader med och utan 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;