MariaDB 触发错误以获取名称长度
Posted
技术标签:
【中文标题】MariaDB 触发错误以获取名称长度【英文标题】:MariaDB Triggers error for getting length of name 【发布时间】:2021-12-27 23:03:16 【问题描述】:我正在尝试查看我的库表中名称的长度是否是允许的长度。 这是我的触发器,但它给了我一个错误。我有一个名为 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 介于 4 到 20 THEN set msg ='名称应该在 5 到 20 个字母之间'; SET MESSAGE_TEXT = 味精;万一;结束"
mysql 说:#1064 - 你的 SQL 语法有错误;检查 与您的 MariaDB 服务器版本相对应的手册 在 'EACH ROW BEGIN IF len(membership.name) NOT 之间使用的语法 4 和 20 THEN 在第 3 行设置 msg ='...'
【问题讨论】:
您似乎不必要地重复了“FOR EACH ROW BEGIN”。复制和粘贴错误? 感谢您的评论!我明白你的意思,但我的代码中没有重复,所以我不确定错误的含义。 【参考方案1】:查看 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() 函数。见LENGTH()。
如果要在插入的新行中引用name
列的值,请使用NEW.name
。
如果要引用插入的新行的列name
,请使用NEW.name
,而不是membership.name
。
您可能还想以某种方式使用 MESSAGE_TEXT 来中止插入,以防与您的规则发生冲突。您可能打算使用SIGNAL。
【讨论】:
感谢您的评论。进行更改后,我仍然收到错误消息。我不知道出了什么问题。这是我的代码:CREATE TRIGGER Student_Name BEFORE INSERT ON membership BEGIN DECLARE msg varchar(100); IF LENGTH(NEW.name) NOT between 5 and 20 THEN set msg ='Name should be between 5 and 20 letters'; SET MESSAGE_TEXT = msg; END IF; END
顺便说一句,错误在第3行。
我的错误,在我的示例中,我删除了“FOR EACH ROW”的两个实例。我在上面编辑了我的答案,将其放回,before BEGIN。
我还添加了关于使用 SIGNAL 的说明。以上是关于MariaDB 触发错误以获取名称长度的主要内容,如果未能解决你的问题,请参考以下文章