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_idacademy_team_idmodule_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 名称后)