Trigger IF语句中的MySQL语法错误?

Posted

技术标签:

【中文标题】Trigger IF语句中的MySQL语法错误?【英文标题】:MySQL syntax error in Trigger IF statement? 【发布时间】:2019-11-26 04:35:40 【问题描述】:

我对 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】:

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 附近使用的正确语法

我注意到您没有以分号结束 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

【讨论】:

以上是关于Trigger IF语句中的MySQL语法错误?的主要内容,如果未能解决你的问题,请参考以下文章

phpmyAdmin 中的 MySQL 触发器错误

MySql 流程控制

CREATE TRIGGER 之前 DELIMITER 上的 MySQL 语法错误

MySQL触发器 trigger学习

在SQL Server2005中,下面调用存储过程的语句错误的是:

TRIGGER 语法错误 mysql 说 #1303 - 无法从另一个存储的例程中创建触发器 - phpmyadmin