Restrições envolvendo NULL

Restrições envolvendo NULL

por Alberto Ferraz -
Número de respostas: 1

Boa tarde, caso declaremos algumas variáveis que podem receber null, mas quando uma assume algum valor e a outra deve ser null, existe alguma forma de fazer isso? Por exemplo:

create table teste (

a int,

b int,

c int,

check (a =1 and b is null)

);

Alguma coisa deste tipo 

Em resposta à Alberto Ferraz

Re: Restrições envolvendo NULL

por Kelly Rosa Braghetto -

Oi, Alberto.

Para fazer o que você quer, é necessário usar a cláusula CHECK mesmo.

A verificação que você fez não está incorreta, apenas está incompleta. A condição que você criou só  é avaliada como verdadeira quando o valor atribuído a "a"  for 1 e o valor de "b" for "null". Ou, seja qualquer outra combinação de valores para esses atributos é considerada inválida. E certamente não é isso que você que expressar, não é mesmo?

Se o que você quer expressar é a seguinte ideia - quando "a"  for 1 então "b" deve ser "null" -  então você precisa de um CHECK como o mostrado abaixo:

create table teste (
    a int,
    b int,
    c int,
    CHECK ((a is NULL) or (a <> 1) or (a = 1 and b is NULL) )
);

A condição acima só é avaliada como verdadeira quando o valor de "a" é diferente de 1, ou quando "a" vale 1 e "b" vale "null".  Teste essa restrição executando os comandos de inserção abaixo:


insert into teste values(NULL, 100, 1000);  -- ok! Quando a é NULL, o valor de b não importa!
insert into teste values(NULL, NULL, 1000);  -- ok! Quando a é NULL, o valor de b não importa!
insert into teste values(1, NULL, 1000);  -- ok! Quando a é 1, b tem que ser NULL.
insert into teste values(1, 100, 1000); --  ERRO! Quando a é 1, b tem que ser NULL!!!
insert into teste values(2, 100, 1000); --  ok! Quando a não é nulo e é diferente de 1, o valor de b não importa!

Até mais,

Kelly