194 votes

Postgresql : Contrainte unique conditionnelle

J'aimerais ajouter une contrainte qui impose l'unicité d'une colonne uniquement dans une partie de la table.

ALTER TABLE stop ADD CONSTRAINT myc UNIQUE (col_a) WHERE (col_b is null);

El WHERE La partie ci-dessus est un vœu pieux.

Y a-t-il un moyen de le faire ? Ou dois-je retourner à la planche à dessin relationnelle ?

330voto

Craig Ringer Points 72371

PostgreSQL ne définit pas de méthode partielle (c.-à-d. conditionnelle) pour le traitement des données. UNIQUE contrainte - cependant, vous peut créer un unique partiel indice .

PostgreSQL utilise des index uniques pour implémenter des contraintes uniques, donc l'effet est le même, avec une mise en garde importante : vous ne pouvez pas effectuer des upserts ( ON CONFLICT DO UPDATE ) contre un index unique comme vous le feriez contre une contrainte unique.

De plus, vous ne verrez pas la contrainte listée dans la section information_schema .

CREATE UNIQUE INDEX stop_myc ON stop (col_a) WHERE (col_b is NOT null);

Ver indices partiels .

75voto

Peter Yeremenko Points 1039

Il a déjà été dit que PG ne définit pas de contrainte UNIQUE partielle (c'est-à-dire conditionnelle). De plus, la documentation indique que la méthode préférée pour ajouter une contrainte unique à une table est la suivante ADD CONSTRAINT Indices uniques

La meilleure façon d'ajouter une contrainte unique à une table est ALTER TABLE ... AJOUTER UNE CONTRAINTE. L'utilisation d'index pour appliquer des contraintes uniques peut être considérée comme un détail d'implémentation auquel il ne faut pas accéder directement. Il faut cependant savoir qu'il n'est pas nécessaire de créer manuellement des index sur les colonnes uniques ; cela ne ferait que dupliquer l'index créé automatiquement.

Il existe un moyen de le mettre en œuvre en utilisant Contraintes d'exclusion (merci à @dukelion pour cette solution)

Dans votre cas, cela ressemblera à

ALTER TABLE stop ADD CONSTRAINT myc EXCLUDE (col_a WITH =) WHERE (col_b IS null);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X