如何在MySQL触发器中编写含多OR条件的复杂IF语句
解决MySQL触发器中多条件IF语句的逻辑问题
哦,我太懂这种卡了好几个小时的憋屈感!你的问题出在IF条件的逻辑判断上,不是语法错误,是逻辑逻辑搞反了。
先拆解你原来的条件问题:
IF (A < 60.00 && NEW.Node <> 'XXX') OR (A < 60.00 && NEW.Node <> 'YYY') OR (A < 60.00 && NEW.Node <> 'ZZZ') THEN
这个逻辑的bug在于:只要A <60,不管Node是XXX、YYY还是ZZZ,整个条件都会成立。比如当Node是XXX时,后面两个OR分支里的NEW.Node <> 'YYY'和NEW.Node <> 'ZZZ'都是真的,再加上A<60,整个表达式就会返回真,这完全违背了你想要的过滤效果。
你真正需要的逻辑应该是:当A小于60,并且Node不是XXX、YYY、ZZZ中的任何一个,所以应该用AND来组合Node的判断,而不是OR。这里有两种简洁且正确的写法:
方法1:使用NOT IN(推荐,代码更简洁易读)
CREATE DEFINER=`administrator`@`%` TRIGGER `My_Trigger` AFTER INSERT ON `my_first_table` FOR EACH ROW BEGIN DECLARE A FLOAT default 0; SET A = NEW.Data; IF A < 60.00 AND NEW.Node NOT IN ('XXX', 'YYY', 'ZZZ') THEN INSERT INTO `my_database`.`my_table` VALUES ('Data 1', 'Data 2', 'Data 3', 'Data 4', NEW.Node, A); END IF; END
方法2:使用多个AND组合不等于判断
如果你更习惯显式写出每个条件,也可以这样写:
CREATE DEFINER=`administrator`@`%` TRIGGER `My_Trigger` AFTER INSERT ON `my_first_table` FOR EACH ROW BEGIN DECLARE A FLOAT default 0; SET A = NEW.Data; IF A < 60.00 AND NEW.Node <> 'XXX' AND NEW.Node <> 'YYY' AND NEW.Node <> 'ZZZ' THEN INSERT INTO `my_database`.`my_table` VALUES ('Data 1', 'Data 2', 'Data 3', 'Data 4', NEW.Node, A); END IF; END
这两种写法都能准确实现你的需求:只有当数据值小于60,且对应的Node不是这三个指定值时,才执行插入操作。
内容的提问来源于stack exchange,提问作者Mohamad Najib
相关产品推荐
相关产品推荐

