在BEFORE INSERT触发器中用WHILE循环计算阶乘报语法错误如何解决?
问题原因及修复方案
语法错误核心原因
- 所有
DECLARE变量声明语句必须放在BEGIN块的最顶部,位于所有赋值、逻辑执行语句之前,你在声明变量f后先执行了set f=1再声明c,违反了MariaDB的存储程序语法规则,直接触发语法报错。 - 现有
WHILE循环未对计数变量c做递增操作,会触发无限循环,执行时会报错超时。 BEFORE INSERT触发器中不需要对当前表主动执行INSERT语句,该操作会触发触发器递归调用,直接修改NEW关键字对应行的fact字段值即可,插入时会自动带入修改后的值。
修正后的完整触发器代码
delimiter // create trigger fact_calc before insert on factorial for each row begin -- 所有变量声明放在最前面 declare f int default 1; declare c int default 1; while(c <= new.n) do set f = f * c; -- 计数变量递增 set c = c + 1; end while; -- 直接修改新插入行的fact字段值 set new.fact = f; end; // delimiter ;
测试验证
执行插入语句测试:
insert into factorial(n) values(5);
查询结果:
select * from factorial where n=5;
会返回n=5, fact=120的正确结果。
内容的提问来源于stack exchange,提问作者MUSTANGBOSS8055
相关产品推荐
相关产品推荐

