Gli indici univoci in Postgres si basano su valori uguali , ma NULL non è mai uguale a nulla, inclusi altri NULL. Pertanto qualsiasi riga con un valore NULL delete_at è distinta da qualsiasi altra riga possibile, quindi puoi inserirne un numero qualsiasi.
Un modo per aggirare questo problema è creare indici parziali , applicando regole diverse alle righe con e senza 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;