2013-02-13 52 views
2

如果在MySQL触发器中有多个if语句,那么最佳方法是什么?MySQL中的多个if语句触发器

目前我的SQL是这样的:

IF NOT (NEW.status <=> OLD.status) THEN 
    {my sql} 

ELSEIF NOT (NEW.actual <=> OLD.actual) THEN 
    {my sql} 
END IF 

乍一看这似乎工作。但是,我注意到,当多个(else)if语句为真时,只有第一个被执行(就像在PHP中一样)。

我该如何使用多个if,不一定是elseif,这样就会执行多于1个语句?使用相同的动作创建多个触发器是不可能的,至少这是phpMyAdmin显示的内容。将多个if放在一个触发器中会导致错误。

回答

5

想通了。我没有使用phpMyAdmin中的可视化GUI来创建触发器,而是使用普通的SQL。

所以我用这个SQL:

delimiter // 
create t1 
after update 
on my_table 
for each row 
    begin 
     IF (NEW.status <> OLD.status) THEN 
      {your sql} 
     END IF; 

     IF (NEW.actual <> OLD.actual) THEN 
      {your sql} 
     END IF;  
    end;// 
delimiter ; 

工作正常。当在phpMyAdmin GUI中查找触发器时,我注意到这是因为必须添加beginend;

+0

我注意到这是因为开始和结束;必须添加......这是真正的一点 – 2017-09-12 11:09:19

-2

使用这样的:

IF (NEW.status <> OLD.status) THEN 
    <statement> 
ELSEIF (NEW.actual <> OLD.actual) THEN 
    <statement> 
END IF; 
+1

生产一样吗?当第一个IF为真时,elseif不被执行。 – edwardmp 2013-02-13 07:30:44

0
if(NEW.shift = 0)then 

SELECT `max_morning` , `count_morning` into @max_morning , @count_morning FROM `count_reserve` where `date` = NEW.date_reserve; 
if(@count_morning is NULL and @max_morning is NULL) then 

    select `max_morning` , `max_evening` into @max_morning , @max_evening from `work_time` where `day` = new.day; 

    insert into `count_reserve` (`date`, `count_morning` ,  `count_evening`,`from_morning`, `to_morning`, `max_morning`, `from_evening`, `to_evening`, `max_evening` , `status_morning` , `status_evening`) values (NEW.date_reserve , 1 , 0 , NULL, NULL, @max_morning , NULL, NULL, @max_evening ,1, 1); 


end if 
end if