Je voudrais ajouter une contrainte qui applique l'unicité sur une colonne uniquement dans une partie d'une table.
ALTER TABLE stop ADD CONSTRAINT myc UNIQUE (col_a) WHERE (col_b is null);
La WHERE
partie ci-dessus est un vœu pieux.
Un moyen de faire ça? Ou devrais-je retourner à la planche à dessin relationnelle?
Réponses:
PostgreSQL ne définit pas de
UNIQUE
contrainte partielle (c'est-à-dire conditionnelle) - cependant, vous pouvez créer un index unique partiel . PostgreSQL utilise des index uniques pour implémenter des contraintes uniques, donc l'effet est le même, vous ne verrez tout simplement pas la contrainte répertoriée dansinformation_schema
.Voir les index partiels .
la source
ERROR: duplicate key value violates unique constraint "stop_myc"
il a déjà été dit que PG ne définit pas une contrainte UNIQUE partielle (ie conditionnelle). La documentation indique également que la meilleure façon d'ajouter une contrainte unique à une table est les
ADD CONSTRAINT
index uniquesIl existe un moyen de l'implémenter en utilisant des contraintes d'exclusion , (merci @dukelion pour cette solution)
Dans votre cas, cela ressemblera à
la source