天天看點

mysql 觸發器詳解 代碼 錯語解答

觸發器trigger 

作用:可以監視 增删改操作 并觸發 增删改操作

監視對象:TALBE表    監視事件:insert update delete 觸發時間:

after before  觸發事件 insert update delete

萬能模版:

建立觸發器 

create  trigger 觸發器名稱 

after/before  insert/update/delete on 表名 

for each row 

begin  

sql 語句—一個或者多個語句範圍在 insert/update/delete内; 

end 

如果隻有一條SQL語句,可以不用begin  end 。直接後面接上就行。

FOR EACH ROW  --觸發器的執行間隔:FOR EACH ROW子句通知觸發器 每隔一行執行一次動作,而不是對整個表執行一次。

還有就是在觸發器中使用變量

set @t_id=new.id;  

set @t_id=old.id;

new可以或則到你新添加進來的資料 old其實也可以 但是在old隻可以在update中使用

Before與After差別:before:(insert、update)可以對new進行修改,after不能對new進行修改。兩者都不能修改old資料。

 在本表插入字段值需要用new計算,隻能用before,在别的表中記錄插入成功記錄或統計插入的條數用after。

變量的話,無論Before,After都可以用。

定義變理有兩種方式:

一:declare t_id int(10);//先申明

       set t_id= new.ID;

二:set @t_name= 'P_Business';;//不事先申明,直接建立

第一種方式不推薦。實驗證明,變量值隻能被附于更大的值,而不能被附于更小的值,有時候還會有幻值。我也不知道這是怎麼回事。但用@定義的值就沒有這樣的問題。

變理可以附于常量,也可以直接附給結果:

SET @ver = (SELECT VERSION FROM zf_cnc_conference.userinfo WHERE  username=new.MobileNum);

還可以更複雜一些:

SET @new_version=(SELECT IFNULL(@ver,0)) ;  

INSERT INTO zf_cnc_conference.userinfo  

        (organizerID,   

        username,   

        email,   

        mobile,   

        telephone,  

        createDate,  

        sipName,  

        sipNum,  

        sipPwd,  

        VERSION  

        )  

        VALUES  

        ( new.organizerID,   

         new.MobileNum,   

        '',   

         new.MobileNum,  

         new.CreateTime,  

         new.sipName,  

         new.sipNum,  

         new.sipPwd,  

         @new_version  

        );  

變量中NEW的用法,NEW隻能搭配before用,作用是從送出上來的SQL語句中調取字段中的内容。比如:set @t_id= new.ID;SQL語句中的ID值會被提取出來,指派給變量t_id。

需要注意以下幾點:

1.MySQL觸發器針對行來操作,是以當處理大資料集的時候可能效率很低。

2.觸發器不能保證原子性,例如在MYISAM中,當一個更新觸發器在更新一個表後,觸發對另外一個表的更新,若觸發器失敗,不會復原第一個表的更新。InnoDB中的

 觸發器和操作則是在一個事務中完成,是原子操作。