在 BEFORE INSERT 触发器中使用 WHILE 循环
Using WHILE loop in BEFORE INSERT trigger
所以我想计算用户输入数字的阶乘。我需要在触发器中使用 WHILE 循环来执行此操作。我知道这种方法 非常 违反直觉,但这是我们被指示这样做的方式。我想出的是,用户将以以下格式的 table 输入他们的数据:
create table factorial(
n int not null,
fact int default 1,
primary key(n));
用户将仅输入数字 'n',随后将激活一个触发器,该触发器将计算阶乘并将其插入相应的 'fact' 单元格中。我想出的触发器是这样的:
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 客户端 运行
DECLARE
必须出现在任何其他语句之前,因此请重新排序触发器。
但是,这里还有其他问题。
- 首先,您必须使用
@f
和 @c
作为变量,否则 MySQl 会假设您指的是列。
- 其次,您没有递增
@c
,因此您的循环将永远 运行。
- 最后,您不能在同一个 table 上从
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;
//
另请注意,这是一个 INSERT
触发器。如果您更新 table 中的一行,这不会 运行。您可能需要第二个类似的 UPDATE
触发器。
所以我想计算用户输入数字的阶乘。我需要在触发器中使用 WHILE 循环来执行此操作。我知道这种方法 非常 违反直觉,但这是我们被指示这样做的方式。我想出的是,用户将以以下格式的 table 输入他们的数据:
create table factorial(
n int not null,
fact int default 1,
primary key(n));
用户将仅输入数字 'n',随后将激活一个触发器,该触发器将计算阶乘并将其插入相应的 'fact' 单元格中。我想出的触发器是这样的:
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 客户端 运行DECLARE
必须出现在任何其他语句之前,因此请重新排序触发器。
但是,这里还有其他问题。
- 首先,您必须使用
@f
和@c
作为变量,否则 MySQl 会假设您指的是列。 - 其次,您没有递增
@c
,因此您的循环将永远 运行。 - 最后,您不能在同一个 table 上从
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;
//
另请注意,这是一个 INSERT
触发器。如果您更新 table 中的一行,这不会 运行。您可能需要第二个类似的 UPDATE
触发器。