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