觸發器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中的
觸發器和操作則是在一個事務中完成,是原子操作。