PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Contrainte unique Postgres n'appliquant pas l'unicité

Les index uniques dans Postgres sont basés sur des valeurs égales , mais NULL n'est jamais égal à quoi que ce soit, y compris les autres NULL. Par conséquent, toute ligne avec une valeur NULL delete_at est distincte de toute autre ligne possible - vous pouvez donc en insérer n'importe quel nombre.

Une solution consiste à créer des index partiels , en appliquant des règles différentes aux lignes avec et sans 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;