Imagina que tienes una tabla simple:
name | is_active
----------------
A | 0
A | 0
B | 0
C | 1
... | ...
Necesito crear una restricción única especial que falla en la siguiente situación: diferentes is_active
valores no pueden coexistir para el mismo name
valor.
Ejemplo de condición permitida:
Nota: un índice único de varias columnas simple no permitirá combinaciones como esta.
A | 0
A | 0
B | 0
Ejemplo de condición permitida:
A | 0
B | 1
Ejemplo de condición fallida:
A | 0
A | 1
-- should be prevented, because `A 0` exists
-- same name, but different `is_active`
Idealmente, necesito una restricción única o un índice parcial único. Los disparadores son más problemáticos para mí.
Doble A,0
permitido, pero (A,0) (A,1)
no lo es.
postgresql
exclusion-constraint
Andrii Skaliuk
fuente
fuente
ERROR: data type boolean has no default operator class for access method "gist"
int
ysmallint
.EXCLUDE USING gist (name WITH =, (is_active::int) WITH <>)
si es booleano. Y la pregunta tiene0
y1
, no,true
yfalse
es bastante improbable que lo haya probado con booleanos;)Este no es un caso en el que puede usar un índice único. Puede probar la condición en un disparador, por ejemplo:
Pruébalo aquí.
fuente