觸發(fā)器,,概念一律不解釋,!
根據(jù)以上語法,做幾點(diǎn)解釋,! 在解釋之前,,闡述下我對觸發(fā)器的觀點(diǎn),! DEFINER:觸發(fā)器的創(chuàng)建者,,可以手動指定創(chuàng)建者,,默認(rèn)為當(dāng)前用戶 BEFORE/AFTER:BEFORE,就是在觸發(fā)的動作之前執(zhí)行你所想要執(zhí)行的語句(begin后面的sql語句);AFTER,在觸發(fā)動作之后執(zhí)行你所想要的語句,! INSERT/UPDATE/DELETE:你所要觸發(fā)的條件,。分別是insert、update,、delete,。這里不單單的針對這三個關(guān)鍵字,同樣的有同類效果的語句也會觸發(fā),!如LOAD DATA和REPLACE語句也會觸發(fā)insert `qqfs_db_gm`.`<Table Name>`:觸發(fā)的對象都是表 語法解釋非常簡單,!需要注意以下幾點(diǎn): 2.對于具有相同觸發(fā)程序動作時間和事件的給定表,不能有兩個觸發(fā)程序,。例如,,對于某一表,不能有兩個BEFORE UPDATE觸發(fā)程序,。但可以有1個BEFORE UPDATE觸發(fā)程序和1個BEFORE INSERT觸發(fā)程序,,或1個BEFORE UPDATE觸發(fā)程序和1個AFTER UPDATE觸發(fā)程序(官方說明) 3.觸發(fā)的對象和觸發(fā)執(zhí)行的語句不能為同一個表!如:觸發(fā)器a觸發(fā)b表的insert操作,然后在b表執(zhí)行insert操作,,會報錯,!這里應(yīng)該是觸發(fā)器的一種強(qiáng)制的鎖機(jī)制!所以就帶有很大的性能損耗,! 4.不能讓兩個觸發(fā)器觸發(fā)兩個表,,并使之循環(huán)!如:觸發(fā)器a觸發(fā)b表的insert操作,,并往d表insert數(shù)據(jù),;觸發(fā)器c觸發(fā)d表的insert操作,并往表b insert數(shù)據(jù),;這樣是不行的,!會報錯如下:Can't update table 'test' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.(第三點(diǎn)也會報這樣的錯誤!) 5.觸發(fā)器中有new和old關(guān)鍵字,。old是指老的數(shù)據(jù),,很容易想到,會產(chǎn)生老數(shù)據(jù)的是update和delete操作,,因為insert之前沒有舊數(shù)據(jù)和該insert有直接關(guān)系,!new關(guān)鍵字是指新數(shù)據(jù),同理可知道,,delete操作是沒有新數(shù)據(jù)產(chǎn)生的,,所有new關(guān)鍵字使用的觸發(fā)條件是insert和update!其實從這里可以看出,,觸發(fā)器又保存了兩份數(shù)據(jù),,結(jié)合上面的對表的觸發(fā)鎖定,觸發(fā)器的性能是不敢恭維的,! 6.如果要在觸發(fā)update的同時,,修改該數(shù)據(jù)加1!用傳統(tǒng)的方法update table set id = old.id + 1;這樣肯定是不行的,,違背了第三點(diǎn),,會報錯:Can't update table 'test' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.注意,這個錯在觸發(fā)器編譯的時候,,是能夠通過的,,但是在更新的時候,數(shù)據(jù)庫會拋這個異常,!
本文出自 “原下” 博客,,請務(wù)必保留此出處http://qdjalone.blog.51cto.com/1222376/885501 |
|