久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

觸發(fā)器說明

 桑枯海 2013-09-11

觸發(fā)器,,概念一律不解釋,!




CREATE

    /*[DEFINER = { user | CURRENT_USER }]*/

    TRIGGER `qqfs_db_gm`.`a` BEFORE/AFTER INSERT/UPDATE/DELETE

    ON `qqfs_db_gm`.`<Table Name>`

    FOR EACH ROW BEGIN



    END


根據(jù)以上語法,做幾點(diǎn)解釋,!


在解釋之前,,闡述下我對觸發(fā)器的觀點(diǎn),!

由于我在游戲行業(yè),所面對的數(shù)據(jù),,都是高并發(fā),,讀寫頻繁,但是數(shù)據(jù)并不一定海量,!這個時候,,我們對性能的要求非常高!觸發(fā)器,,對性能影響過大,!所以,在我們的幾個項目中,,我從沒有引入觸發(fā)器,!不過對于小數(shù)據(jù),或者是低并發(fā),、修改不頻繁的應(yīng)用,,適當(dāng)?shù)囊胗|發(fā)器還是可以行的!


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 DATAREPLACE語句也會觸發(fā)insert


`qqfs_db_gm`.`<Table Name>`:觸發(fā)的對象都是表


語法解釋非常簡單,!需要注意以下幾點(diǎn):

1.觸發(fā)器里面不允許執(zhí)行動態(tài)語句!或者是執(zhí)行帶動態(tài)語句的存儲過程,、存儲函數(shù)等,!


2.對于具有相同觸發(fā)程序動作時間和事件的給定表,不能有兩個觸發(fā)程序,。例如,,對于某一表,不能有兩個BEFORE  UPDATE觸發(fā)程序,。但可以有1BEFORE  UPDATE觸發(fā)程序和1BEFORE  INSERT觸發(fā)程序,,或1BEFORE  UPDATE觸發(fā)程序和1AFTER 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ù)庫會拋這個異常,!

如果一定要這樣做,,那該怎么辦呢?借助關(guān)鍵字new和old.

SET new.id = new.id + 1;

利用這個特性,,可以實現(xiàn)很多功能,!讀者可以自己發(fā)散,,嘿嘿!


 

本文出自 “原下” 博客,,請務(wù)必保留此出處http://qdjalone.blog.51cto.com/1222376/885501


     

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多