mysql - 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; //
解决方案
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
推荐阅读
- javascript - 如何使用 Jest/Enzyme 在功能性 React 组件中测试 lambda 函数?
- swift - 如何使用 Typealias 或 Closure 在 swift 中定义一个带有 name 参数的常量?
- php - 在自定义帖子类型中使用 ACF 复选框字段来过滤不同自定义帖子类型的结果
- android - 带有数据绑定的 Android 分页库
- uml - UML 中的模型“汽车必须由个人或公司拥有”
- node.js - 如何批量加载 Firebase EqualTo() 查询?
- php - 具有 Passport API 身份验证的 API 更新端点
- android - 启动 APK 安装程序 Kitkat
- java - 如何解决 ClassNotFoundException:com.beust.jcommander.ParameterException
- scala - 为什么一个演员要开始两次?