MySQL触发器IF语句OR逻辑异常:双条件匹配时不触发执行
解决MySQL AFTER UPDATE触发器多字段同时变更不触发的问题
嘿,我一眼就看出问题出在哪了——你写的判断逻辑搞反啦!
咱们先理清楚:<=>是MySQL的NULL-safe相等运算符,当两边值(包括NULL)完全相等时返回TRUE,不相等时返回FALSE。你的触发器条件是:
IF NEW.margem_consig <=> OLD.margem_consig OR NEW.margem_cartao <=> OLD.margem_cartao THEN
这意思是:当margem_consig没变化,或者margem_cartao没变化的时候才执行插入动作。
那为什么单个字段变更时能触发呢?比如你只改了margem_consig,这时候NEW.margem_consig <=> OLD.margem_consig是FALSE,但margem_cartao没变化,所以NEW.margem_cartao <=> OLD.margem_cartao是TRUE,FALSE OR TRUE结果是TRUE,所以触发器执行了。
但当你同时改两个字段时,两个<=>的结果都是FALSE,FALSE OR FALSE就是FALSE,自然不会执行插入动作啦!
正确的写法
你需要判断的是至少有一个字段发生了变化,也就是用NOT取反每个<=>的结果,再用OR连接:
BEGIN IF NOT (NEW.margem_consig <=> OLD.margem_consig) OR NOT (NEW.margem_cartao <=> OLD.margem_cartao) THEN INSERT INTO historico_margem (idmatricula, margem, margem_cartao, margem_confiavel) VALUES (OLD.idmatricula, NEW.margem_consig, NEW.margem_cartao, NEW.margem_confiavel); END IF; END
这种写法能覆盖所有值变化的场景,包括字段从NULL变成非NULL、或者反过来的情况,比直接用!=更稳妥(!=无法处理NULL相关的变更判断)。
验证逻辑
- 单个字段变更:其中一个
NOT <=>返回TRUE,OR结果为TRUE,触发插入 - 两个字段同时变更:两个
NOT <=>都返回TRUE,OR结果为TRUE,触发插入 - 两个字段都没变化:两个
NOT <=>都返回FALSE,OR结果为FALSE,不触发
这样就完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者Ijimero
相关产品推荐
相关产品推荐

