Imagine que você tem uma tabela simples:
name | is_active
----------------
A | 0
A | 0
B | 0
C | 1
... | ...
Preciso criar uma restrição única e especial que falha na seguinte situação: is_active
valores diferentes não podem coexistir para o mesmo name
valor.
Exemplo de condição permitida:
Nota: o índice único simples de várias colunas não permitirá combinações como esta.
A | 0
A | 0
B | 0
Exemplo de condição permitida:
A | 0
B | 1
Exemplo de condição com falha:
A | 0
A | 1
-- should be prevented, because `A 0` exists
-- same name, but different `is_active`
Idealmente, preciso de restrição ou índice parcial exclusivo. Os gatilhos são mais problemáticos para mim.
Duplo A,0
permitido, mas (A,0) (A,1)
não é.
postgresql
exclusion-constraint
Andrii Skaliuk
fonte
fonte
ERROR: data type boolean has no default operator class for access method "gist"
int
esmallint
.EXCLUDE USING gist (name WITH =, (is_active::int) WITH <>)
se for booleano. E a pergunta tem0
e1
, nãotrue
efalse
por isso é bastante improvável que eu testei com booleans;)Este não é um caso em que você pode usar um índice exclusivo. Você pode testar a condição em um gatilho, por exemplo:
Teste aqui.
fonte