SQL 更新后触发更新下一行
SQL trigger after update update next row
我有一个看起来像这样的 table:
Columns:
user_id int(11) PK
module_id int(11) PK
academy_team_id int(11) PK
academy_id int(11) PK
sort_number int(11)
is_complete int(11)
score_to_pass int(11)
is_open int(11)
现在我想添加一个触发器,这样当您更新此 table 如果值 is_complete
等于 1
则更新下一行的 is_open
和设置为1
我尝试使用以下触发器 sql:
begin
if new.is_complete = 1 then
set next.is_open = 1;
end if ;
end
遗憾的是,这没有用,所以我不确定该怎么做,谁能把我推向正确的方向?
据pala_回答
我在更新我的行时遇到以下错误:
ERROR 1442: 1442: Can't update table 'user_has_academy_module' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
SQL Statement:
UPDATE `system`.`user_has_academy_module` SET `is_complete`='1' WHERE `user_id`='1' and`module_id`='11' and`academy_team_id`='49' and`academy_id`='29'
你的基本触发体应该是这样的:
begin
if new.is_complete = 1 and (select id from <table> where user_id = new.user_id and module_id = new.module_id and academy_team_id = new.academy_team_id sort_number = new.sort_number +1 ) then
update <table> set is_open = 1
where user_id = new.user_id
and academy_team_id = new.academy_team_id
and module_id = new.module_id
and sort_number = new.sort_number + 1;
end if
end
它会检查是否还有其他东西要打开(基于相同的 user_id
、academy_team_id
和 module_id
,以及下一个顺序 sort_number
),如果有,请将其打开。
MySQL 无法更新相同的 table 触发器已设置。它将需要使用存储过程来完成。
delimiter //
create procedure completeandopen(IN param INT)
begin
declare next_id integer;
declare _user_id integer;
declare _module_id integer;
declare _academy_team_id integer;
declare _sort_number integer;
select user_id,
module_id,
academy_team_id,
sort_number
into _user_id,
_module_id,
_academy_team_id,
_sort_number
from tester
where id = param;
update tester set is_complete = 1 where id = param;
select id
into next_id
from tester
where id = param + 1
and user_id = _user_id
and module_id = _module_id
and academy_team_id = _academy_team_id
and sort_number = _sort_number + 1;
if (next_id is not null) then
update tester set is_open = 1 where id = next_id;
end if;
end//
delimiter ;
我认为这应该可行 - 我没有在您的 table 结构上进行测试,它确实假定您的 table 上有一个唯一的主键。如果没有 - 修改起来很容易。
要使用它,只需 call completeandopen(id of the row to be completed)
(将 table 名称从 tester
更改为您的 table 名称后)
我有一个看起来像这样的 table:
Columns:
user_id int(11) PK
module_id int(11) PK
academy_team_id int(11) PK
academy_id int(11) PK
sort_number int(11)
is_complete int(11)
score_to_pass int(11)
is_open int(11)
现在我想添加一个触发器,这样当您更新此 table 如果值 is_complete
等于 1
则更新下一行的 is_open
和设置为1
我尝试使用以下触发器 sql:
begin
if new.is_complete = 1 then
set next.is_open = 1;
end if ;
end
遗憾的是,这没有用,所以我不确定该怎么做,谁能把我推向正确的方向?
据pala_回答
我在更新我的行时遇到以下错误:
ERROR 1442: 1442: Can't update table 'user_has_academy_module' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
SQL Statement:
UPDATE `system`.`user_has_academy_module` SET `is_complete`='1' WHERE `user_id`='1' and`module_id`='11' and`academy_team_id`='49' and`academy_id`='29'
你的基本触发体应该是这样的:
begin
if new.is_complete = 1 and (select id from <table> where user_id = new.user_id and module_id = new.module_id and academy_team_id = new.academy_team_id sort_number = new.sort_number +1 ) then
update <table> set is_open = 1
where user_id = new.user_id
and academy_team_id = new.academy_team_id
and module_id = new.module_id
and sort_number = new.sort_number + 1;
end if
end
它会检查是否还有其他东西要打开(基于相同的 user_id
、academy_team_id
和 module_id
,以及下一个顺序 sort_number
),如果有,请将其打开。
MySQL 无法更新相同的 table 触发器已设置。它将需要使用存储过程来完成。
delimiter //
create procedure completeandopen(IN param INT)
begin
declare next_id integer;
declare _user_id integer;
declare _module_id integer;
declare _academy_team_id integer;
declare _sort_number integer;
select user_id,
module_id,
academy_team_id,
sort_number
into _user_id,
_module_id,
_academy_team_id,
_sort_number
from tester
where id = param;
update tester set is_complete = 1 where id = param;
select id
into next_id
from tester
where id = param + 1
and user_id = _user_id
and module_id = _module_id
and academy_team_id = _academy_team_id
and sort_number = _sort_number + 1;
if (next_id is not null) then
update tester set is_open = 1 where id = next_id;
end if;
end//
delimiter ;
我认为这应该可行 - 我没有在您的 table 结构上进行测试,它确实假定您的 table 上有一个唯一的主键。如果没有 - 修改起来很容易。
要使用它,只需 call completeandopen(id of the row to be completed)
(将 table 名称从 tester
更改为您的 table 名称后)