【问题标题】:How to create Complex IF Condition in MySQL Trigger如何在 MySQL 触发器中创建复杂的 IF 条件
【发布时间】:2019-02-27 11:15:18
【问题描述】:

我的触发器在这里有问题。我的 IF 语句无法正常工作。我被卡住了,花了很多时间试图解决它。

这是我的代码:

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 && NEW.Node <> 'XXX') OR (A < 60.00 && NEW.Node <> 'YYY') OR (A < 60.00 && 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

所以,如果我只使用一个节点(而不是在 if 语句中使用 OR),那么触发器就可以正常工作了。

问题是,如何用很多OR做IF语句?

谢谢

【问题讨论】:

  • 确切的错误消息是什么,以及您尝试执行的确切语句是什么?
  • 添加多个OR子句时,它在什么情况下不起作用?
  • @Nick if 语句不起作用,节点值为 XXX、YYY 和 ZZZ 的数据已插入 my_table。我只想在A低于60时插入,并且节点不是XXX,YYY,ZZZ
  • 啊那你的逻辑不对,你应该用AND,而不是OR,你可以简化成A &lt; 60.00 AND NEW.Node &lt;&gt; 'XXX' AND NEW.Node &lt;&gt; 'YYY AND NEW.Node &lt;&gt; 'ZZZ'
  • Topicstarter 和 @Nick 注意到代码中的 AFTER INSERT ON my_table` 和 INSERT INTO my_database.my_table` 这是不可能的,他试图插入到同一个表中触发器正在运行..这是不可能的,因为无限循环..

标签: mysql sql triggers database-trigger


【解决方案1】:

如果只想在A小于60时插入,且节点不是XXX、YYY、ZZZ,则需要使用AND逻辑代替。试试这个:

IF (A < 60.00 AND NEW.Node <> 'XXX' AND NEW.Node <> 'YYY' AND NEW.Node <> 'ZZZ')

【讨论】:

  • 您好,感谢您的更正,现在可以使用了。再次感谢您
  • @MohamadNajib 不用担心。很高兴我能帮上忙。
【解决方案2】:

你似乎想要NOT IN:

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;

我也强烈建议您使用AND 和OR——它们是SQL 中的标准布尔运算符——而不是|| 和&amp;&amp;,它们是MySQL 扩展。

【讨论】:

    【解决方案3】:

    您是否尝试过使用|| 而不是OR 或尝试封装这三个条件。 试试下面的例子是否适合你。

    IF (A < 60.00 AND (NEW.Node <> 'XXX' OR NEW.Node <> 'YYY' OR 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
    

    【讨论】:

    • OR 和 || 在 MySQL 中是一回事。
    • 是的,但在条件中混合使用 &amp;&amp; 和 OR 对我来说毫无意义。
    • 这是一个有效的观点,但它不能解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2016-01-22
    相关资源
    最近更新 更多