触发器IF语句中的MySQL语法错误?

时间:2019-11-26 04:35:40

标签: mysql sql triggers

我是SQL的新手,触发器中的语法有问题。我试图将赛后的马匹的最低额定为1,最高额定为5。问题似乎出在IF语句上。 任何帮助将不胜感激。

CREATE TRIGGER new_rating
AFTER insert on stats
FOR EACH ROW
BEGIN
    IF (new.rating > 5) THEN
    SET new.rating = 5
    ELSEIF (new.rating < 1) THEN
    SET new.rating = 1
     END IF;
END; //

1 个答案:

答案 0 :(得分:1)

  

错误1362(HY000):触发后不允许更新NEW行

这是错误。这意味着您不能使用SET来更改要插入的行的任何值,因为在AFTER INSERT触发器中,该行已被插入。您必须在BEFORE INSERT触发器中执行此操作,才能使其正常工作。

您应该阅读https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html,其中指出:

  

这种SET语句在AFTER触发器中不起作用,因为行更改已经发生。

如果我更正此错误并将其更改为BEFORE INSERT触发器,则会收到此错误:

  

错误1064(42000):您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册以获取正确的语法,以在'ELSEIF(new.rating <1)附近使用...

我注意到您没有用分号结束SET语句。必须终止触发器中的每个语句,包括SET语句。

这是有效的触发器:

CREATE TRIGGER new_rating BEFORE insert on stats
FOR EACH ROW BEGIN
     IF (new.rating > 5) THEN
         SET new.rating = 5;
     ELSEIF (new.rating < 1) THEN
         SET new.rating = 1;
     END IF;
END