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

触发器IF语句中的MySQL语法错误?,mysql,sql,triggers,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

我对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; //
创建新的触发等级
在统计数据上插入后
每行
开始
如果(新评级>5),则
设置新的额定值=5
ELSEIF(新评级<1)则
设置新的额定值=1
如果结束;
结束//
错误1362(HY000):在after触发器中不允许更新新行

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

你应该读一读,上面写着:

这样的SET语句在AFTER触发器中无效,因为行更改将已经发生

如果在插入触发器之前更正此错误并将其更改为
,则会出现以下错误:

错误1064(42000):您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用near'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
在插入统计数据之前创建触发新的_评级
每行开始
如果(新评级>5),则
设置新的。额定值=5;
ELSEIF(新评级<1)则
设置新的。额定值=1;
如果结束;
结束