Eu tenho este gatilho:
delimiter $$
create trigger tr
after update on t1
for each row
begin
if new.col1 !=old.col1
then update t2 set col2 =1 where t2.col3=t1.col3;
end if;
end
$$
Este gatilho funciona quando col1
o valor de muda de 0 para 1, mas quando muda de nulo para 1, o gatilho não faz nenhuma alteração em t2
.
Eu só queria saber porque é assim. Sei que null é diferente, mas estou apenas comparando os valores.
Eu resolvi meu problema fazendo new.col1 =1
.
Altere a condição if para:
Isso deve resolver o seu problema. O código original não funcionou corretamente porque você não pode testar a igualdade com um
NULL
valor - você deve usarIS NULL
ouIS NOT NULL
.O MySQL também tem um operador "null-safe equals":
<=>
que pode ser usado aqui para tornar a condição acima mais simples (e ainda equivalente):Explicação:
<=> é um operador null safe, do manual do MySQL:
Cuidado, porém, que esse gatilho também será acionado quando
col1
o valor de for alterado de 1 paraNULL
, não sei se é isso que você deseja.Você pode reescrever a condição dessa maneira, se não quiser esse comportamento:
Isso torna a desigualdade sensível a maiúsculas e minúsculas
Use ifnull para verificar e comparar. Abaixo está o exemplo com a suposição de que você não terá 'xxxxxx' como dados reais.