Est-il possible d'avoir une contrainte de colonne unique personnalisée comme suit? Supposons que j'ai deux colonnes subset
et les type
deux chaînes (bien que les types de données n'aient probablement pas d'importance).
Si type
c'est "vrai", alors je veux que la combinaison de type
et subset
soit unique. Sinon, il n'y a pas de contrainte. J'utilise PostgreSQL 8.4 sur Debian.
postgresql
index
constraint
unique-constraint
postgresql-8.4
Faheem Mitha
la source
la source
Réponses:
En d'autres termes, vous voulez
subset
être unique sitype = 'true'
.Un index unique partiel fera cela:
De cette façon, vous pouvez même créer des combinaisons avec
NULL
unique, ce qui n'est pas possible autrement - comme détaillé dans cette réponse connexe:contrainte unique à plusieurs colonnes PostgreSQL et valeurs NULL
la source
Ceci est complémentaire à la réponse d'Erwin ci-dessus, mais PostgreSQL prend en charge un tas de types d'index. Ce ne sont généralement pas mutuellement exclusifs. Vous pouvez les considérer comme:
Ceux-ci peuvent tous être combinés de différentes manières. Tout ce que vous faites ici est d'utiliser les fonctionnalités uniques et partielles, ce qui vous donne des index uniques partiels (qui sont extrêmement utiles lorsque vous le découvrez).
Mais supposons que vous vouliez avoir un index insensible à la casse sur le champ de sous-ensemble où le type est vrai. Ensuite, vous ajouteriez une définition fonctionnelle:
Notez que cela crée un index unique sur la sortie de la fonction lower () appelée sur l'attribut de sous-ensemble où type est true.
la source