【问题标题】:Using WHILE loop in BEFORE INSERT trigger在 BEFORE INSERT 触发器中使用 WHILE 循环
【发布时间】:2021-11-23 10:18:16
【问题描述】:

所以我想计算用户输入数字的阶乘。我需要在触发器中使用 WHILE 循环来执行此操作。我知道这种方法非常违反直觉,但这是我们被指示这样做的方式。我想出的是,用户将在以下格式的表格中输入他们的数据:

create table factorial(
    n int not null,
    fact int default 1,
    primary key(n));

用户将只输入数字“n”,随后将激活一个触发器,该触发器将计算阶乘并将其插入相应的“事实”单元格。我想出的触发器是这样的:

delimiter //
create trigger fact_calc
     before insert on factorial for each row
     begin
     declare f int;
     set f=1;
     declare c int;
     set c=1;
     while(c<=new.n)
     do
     set f=f*c;
     end while;
     insert into factorial(fact) values(f);
     end;
     //

但这会在 declare c int; 行引发语法错误,我似乎无法弄清楚原因。任何帮助将不胜感激。

我使用的是在 Windows 10 上运行的 MariaDB 10.6 客户端。

【问题讨论】:

    标签: mysql while-loop triggers mariadb


    【解决方案1】:

    DECLARE 必须出现在任何其他语句之前,因此请重新排序触发器。

    但是,这里还有其他问题。

    • 首先,您必须使用 @f@c 作为变量,否则 MySQl 会假定您指的是列。
    • 其次,您不会增加 @c,因此您的循环将永远运行。
    • 最后,您不能在同一张表上从INSERT 触发器执行INSERT。只需使用另一个SET

    做出这些改变会得到

    delimiter //
    create trigger fact_calc
         before insert on factorial for each row
         begin
         declare f int;
         declare c int;
         set @f=1;
         set @c=1;
         while(@c<=new.n)
         do
         set @f=@f*@c;
         set @c = @c+1;
         end while;
         set new.fact = @f;
         end;
         //
    

    Reference

    另请注意,这是一个INSERT 触发器。如果您更新表中的一行,这将不会运行。您可能需要第二个类似的UPDATE 触发器。

    【讨论】:

      猜你喜欢
      • 2014-05-08
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多