tenho uma mesa parecida com essa
create table my_table
(
id serial,
attribute boolean,
number integer
)
Existe uma maneira de forçar não nulo na coluna number
IF attribute
valor é true
?
Portanto, se um registro for salvo com o valor de atributo 'true', o número deve receber um valor.
EDIT: Depois de algumas escavações, tentei isso
alter table my_table
add constraint number_must_have_value CHECK (attribute = 't' and number IS NOT NULL)
A restrição de lançamento é violada por alguma linha, mas se eu executar:
select * from my_table where attribute = 't' and number IS NOT NULL
Eu recupero 0 linhas. Então meus dados parecem estar OK?
Para forçá-lo de qualquer maneira eu tento usar
constraint number_must_have_value NOT VALID CHECK (attribute = 't' and number IS NOT NULL)
Mas não consigo fazer a opção NOT VALID funcionar. Eu recebo um erro de sintaxe. Não está no lugar certo?
CHECK
Esta é uma restrição bastante simples :A lógica por trás do código é que a restrição lógica
if a then b
é escrita em lógica booleana como(not a) or (b)
. Pode parecer contra-intuitivo à primeira vista, mas se você escrever as possíveis combinações booleanas, funcionará.A restrição também pode ser escrita como o
CHECK ( NOT (attribute AND number IS NULL) )
que pode parecer um pouco mais explicativo ( "não permitir que o atributo seja falso e o número seja nulo ao mesmo tempo" ). Escolha o que for mais legível para você.