Ajout d'une condition à une contrainte unique
J'ai actuellement la contrainte suivante sur une table:
ALTER TABLE myTable
ADD CONSTRAINT unique_row UNIQUE (content_id, brand_id, language_id);
Je veux ajouter une condition à la contrainte: je veux que la contrainte fonctionne de la même manière, mais avec une seule ligne où is_archived est FALSE:
ALTER TABLE myTable
ADD CONSTRAINT unique_row UNIQUE (content_id, brand_id, language_id, !is_archived);
Cependant, lorsque je fais cela, j'obtiens une erreur de syntaxe.
Si is_archived = true
alors plusieurs lignes avec la même combinaison de content_id
et brand_id
sont autorisées. En gros, plusieurs lignes identiques peuvent être archivées, mais une seule peut être désarchivée.
Réponses
Bien que Postgres n'autorise pas une contrainte partiellement unique, il prend en charge un index unique partiel:
create unique index unique_row on myTable(content_id, brand_id) where not is_archived;
Voir Index partiels dans la documentation Postgres.
C'est en fait à peu près la même chose qu'une contrainte unique, car ces contraintes sont de toute façon implémentées avec des index uniques.