首页 > 解决方案 > Trigger IF语句中的MySQL语法错误?

问题描述

我对 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; //

标签: mysqlsqltriggers

解决方案


ERROR 1362 (HY000): 触发器后不允许更新新行

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

你应该阅读https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html上面写着:

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

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

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

我注意到您没有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

推荐阅读