Ajout d'une condition à une contrainte unique

Dec 05 2020

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 = truealors plusieurs lignes avec la même combinaison de content_idet brand_idsont autorisées. En gros, plusieurs lignes identiques peuvent être archivées, mais une seule peut être désarchivée.

Réponses

4 Colin'tHart Dec 05 2020 at 00:59

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.