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_activevalores no pueden coexistir para el mismo namevalor.
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,0permitido, 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"intysmallint.EXCLUDE USING gist (name WITH =, (is_active::int) WITH <>)si es booleano. Y la pregunta tiene0y1, no,trueyfalsees 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