我有一张看起来像这样的表:
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)
现在我想添加一个触发器,以便在更新此表时,如果值is_complete
等于1
,则更新下一行的is_open
并将其设置为{{1 }}
我尝试过以下触发器sql:
1
可悲的是,这没有用,所以我不知道如何做到这一点,任何人都可以把我推向正确的方向吗?
根据pala_答案
我在更新行时遇到以下错误:
begin
if new.is_complete = 1 then
set next.is_open = 1;
end if ;
end
答案 0 :(得分:1)
你的基本触发器主体应该是这样的:
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
,以及下一个顺序{{ 1}}),如果有,请将其设置为打开。
MySQL无法更新设置触发器的同一个表。它需要使用存储过程来完成。
sort_number
我认为这应该可行 - 我没有在你的表结构上进行测试,它确实假设你桌子上有一个唯一的主键。如果它没有 - 那很容易修改。
要使用它,只需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 ;
(将表名从call completeandopen(id of the row to be completed)
更改为您的表名后)