MariaDB创建校验name长度的触发器时出现1064语法错误求助
触发器语法报错排查及修复方案
错误原因汇总
- 重复定义
FOR EACH ROW:创建触发器的语法中BEFORE INSERT ON membership FOR EACH ROW已经声明了行级触发逻辑,代码内部二次书写FOR EACH ROW属于语法错误,就是报错提示指向的位置 - 新行字段取值错误:校验待插入的字段值需要用
NEW.name指代,直接写membership.name无法匹配到当前操作的行数据 - 长度函数不支持:MySQL/MariaDB没有内置
len()函数,统计字符串长度要使用LENGTH()(统计字节数)或CHAR_LENGTH()(统计字符数) - 缺少异常抛出语句:仅设置
MESSAGE_TEXT无法触发异常终止写入,需要配合SIGNAL SQLSTATE '45000'主动抛出自定义错误 - 代码结构不完整:缺少
END闭合代码块,也没有设置自定义分隔符避免内部分号和SQL语句结束符冲突 - 校验逻辑前后矛盾:判断条件写的是
NOT between 4 and 20,错误提示写的是5到20,逻辑不统一
修正后完整触发器代码
DELIMITER // CREATE TRIGGER `Student_Name` BEFORE INSERT ON `membership` FOR EACH ROW BEGIN DECLARE msg varchar(100); -- 用CHAR_LENGTH统计字符数,适配中文姓名场景,需要统计字节数就换成LENGTH IF CHAR_LENGTH(NEW.name) NOT BETWEEN 5 AND 20 THEN SET msg = 'Name should be between 5 and 20 letters'; SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg; END IF; END // DELIMITER ;
提示:如果需要同时校验UPDATE操作的name字段,可以额外创建一个
BEFORE UPDATE的同逻辑触发器,或者直接创建同时支持INSERT和UPDATE的触发器。
内容的提问来源于stack exchange,提问作者Qi'ra
相关产品推荐
相关产品推荐

