Imaginez que vous ayez un tableau simple:
name | is_active
----------------
A | 0
A | 0
B | 0
C | 1
... | ...
J'ai besoin de créer une contrainte unique spéciale qui échoue dans la situation suivante: des is_active
valeurs différentes ne peuvent pas coexister pour la même name
valeur.
Exemple de condition autorisée:
Remarque: un index unique multi-colonnes simple ne permet pas une telle combinaison.
A | 0
A | 0
B | 0
Exemple de condition autorisée:
A | 0
B | 1
Exemple de condition ayant échoué:
A | 0
A | 1
-- should be prevented, because `A 0` exists
-- same name, but different `is_active`
Idéalement, j'ai besoin d'une contrainte unique ou d'un index partiel unique. Les déclencheurs sont plus problématiques pour moi.
Double A,0
autorisé, mais (A,0) (A,1)
non.
la source
ERROR: data type boolean has no default operator class for access method "gist"
int
etsmallint
.EXCLUDE USING gist (name WITH =, (is_active::int) WITH <>)
si c'est booléen. Et la question a0
et1
, nontrue
etfalse
il est donc peu probable que je teste avec des booléens;)Ce n'est pas un cas où vous pouvez utiliser un index unique. Vous pouvez tester la condition dans un déclencheur, par exemple:
Testez-le ici.
la source