更新更新下一行后的SQL触发器

时间:2015-05-01 17:20:37

标签: mysql sql triggers

我有一张看起来像这样的表:

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

1 个答案:

答案 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_idacademy_team_idmodule_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)更改为您的表名后)