mysql - MariaDB 触发错误以获取名称长度
问题描述
我正在尝试查看我的库表中名称的长度是否是允许的长度。这是我的触发器,但它给了我一个错误。我有一个名为 members 的表,它有一个名为 name 的列,用于显示每个具有会员资格的人的姓名。
任何帮助将不胜感激!
这是我的触发器:
BEGIN
DECLARE msg varchar(100);
FOR EACH ROW BEGIN
IF len(membership.name) NOT between 4 and 20 THEN
set msg ='Name should be between 5 and 20 letters';
SET MESSAGE_TEXT = msg;
END IF;
END
这是我得到的错误:
以下查询失败:“CREATE TRIGGER `Student_Name` BEFORE INSERT ON `membership` FOR EACH ROW BEGIN DECLARE msg varchar(100); FOR EACH ROW BEGIN IF len(membership.name) NOT between 4 and 20 THEN set msg ='名称应在 5 到 20 个字母之间'; SET MESSAGE_TEXT = msg; END IF; END "
MySQL 说:#1064 - 你的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 3 行的“EACH ROW BEGIN IF len(membership.name) NOT between 4 and 20 THEN set msg ='...”附近使用正确的语法
解决方案
查看 CREATE TRIGGER 的语法:https ://mariadb.com/kb/en/create-trigger/
您只能在触发器主体之前使用 FOR EACH ROW 一次。
在您的 DECLARE 行之后,您还第二次使用了 FOR EACH ROW。把它拿出来。
CREATE TRIGGER Student_Name BEFORE INSERT ON membership
FOR EACH ROW
BEGIN
DECLARE msg varchar(100);
FOR EACH ROW BEGIN <---- remove this line
IF LENGTH(NEW.name) NOT between 4 and 20 THEN
SET msg ='Name should be between 5 and 20 letters';
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = msg;
END IF;
END
还有其他问题。
这一行:
IF len(membership.name) NOT between 4 and 20 THEN
没有 LEN() 函数。请参阅长度()。
如果要name
在插入的新行中引用列的值,请使用NEW.name
.
如果要引用name
插入的新行的列,请使用NEW.name
,而不是membership.name
。
如果与您的规则发生冲突,您可能还想以某种方式使用 MESSAGE_TEXT 中止插入。您可能打算使用SIGNAL。
推荐阅读
- ios - WKWebView 使用 loadHTMLString:baseURL: api,WKURLSchemeTask 不起作用
- android - 具有特定活动的多次访问的共享数据
- javascript - 如何在输入字段中使用 bootstrap 4 制作芯片
- r - 在 dplyr group_by 函数中忽略(但不删除)NA
- android - Android - sharedpreferences 数据正在与 apk 一起上传到 Play 商店
- javascript - Firebase 事务未更新/返回 Null
- autodesk-viewer - 如何在 Autodesk-viewer 中设置元素的透明性?
- android - 如何创建 android LatLng 的边界(两点)以显示在屏幕顶部?在安卓中
- python - 如何解析包含不确定数据模式的日志文件?
- javascript - 使用 css、javascript、两个按钮 onclick() 的两个动画