简体   繁体   中英

SQL trigger after update update next row

I have a table that looks something like this:

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)

Now i wish to add a trigger so that when you update this table if the value is_complete is equal to 1 then update the next row's is_open and set it to 1

I have attempted with the following trigger sql:

   begin
 if new.is_complete = 1 then
   set next.is_open = 1;
 end if ;
end

Sadly this did not work so im not sure how to do it can anyone push me in the right direction?

According to pala_ Answer

im getting the following error when updating my row:

    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'

Your basic trigger body should be something like this:

 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 

It will check to see if there IS another thing to set open (based on same user_id , academy_team_id and module_id , and next sequential sort_number ), and if there is, set it open.

MySQL cant update the same table the trigger is set on. It will need to be done with a stored procedure instead.

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 ;

I think this should work - i haven't tested on your table structure, and it does assume a unique primary key on your table. If it doesn't have that - it's easy enough to modify.

To use it, just call completeandopen(id of the row to be completed) (after changing the table name from tester to your table name)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM