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语法错误?的主要内容,如果未能解决你的问题,请参考以下文章
CREATE TRIGGER 之前 DELIMITER 上的 MySQL 语法错误