mysql之觸發器

       觸發器是一種 特殊的存儲過程,不同的是存儲過程要用CALL來調用,而觸發器不需要使用CALL也不需要手工啓動,只要當一個預定義的事件發生時,就會被MYSQL自動調用。它在插入,刪除或修改特定表中的數據時觸發執行,它比數據庫本身的標準功能有更精細和更復雜的數據控制能力。它是一種與表操作有關的數據庫對象,當觸發器所在表上出現指定事件時,將調用該對象,即表的操作事件觸發表上的觸發器的執行。

      

創建觸發器:

       創建觸發器語法如下:

              CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW tigger_stmt

       其中:

                trigger_name:標識觸發器名稱,由用戶自定義

                trigger_time  :標識觸發時機,取值爲BEFORE或AFTER,以指明觸發程序是在激活它的語句之前或之後觸發

                trigger_event:標識觸發事件,取值爲INSERT,UPDATE或DELETE

                tbl_name:標識建立觸發器的表名,即在哪張表上建立觸發器

                trigger_stmt:觸發器程序體,可以是一句sql語句,或者用BEGIN和END包含的多條語句。觸發程序是與表有關的命名數據庫對象,當表上出現特定事件時,將激活該對象。觸發程序與命名爲tbl_name的表相關。tbl_name必須引用永久性表。


        由此可見,我們可以建立6種觸發器,即BEFORE INSERT,BEFORE UPDATE,BDFORE DELETE,AFTER INSERT,AFTER UPDATE,AFTER DELETE。另外,我們不能在同一張表上建立2個相同類型的觸發器,因此在一個表上最多建立6個觸發器。

  

接下來我們詳細瞭解下trigger_event:

       mysql除了對INSERT,UPDATE,DELETE基本操作進行定義外,還定義了LOAD DATA和REPLACE語句,這兩種語句也能引起上述6種類型的觸發器的觸發。

               LOAD DATA語句用於將一個文件裝入到一個數據表中,相當於一系列的INSERT操作。

               REPLACE語句一般來說和INSERT語句很像,只是在表中有primary key或unique索引時,如果插入的數據和原來primary key和unique索引一致時,會先刪除原來的數據,然後增加一條新數據,也就是說,一條REPLACE語句有時等價於一條INSERT語句,有時候等價於一條DELETE語句加上一條INSERT語句。

              trigger_event指明瞭激活觸發程序的語句的類型,可以是下述值之一:

                       INSERT:將新行插入表時激活觸發器程序,例如通過INSERT,LOAD DATA,和REPLACE語句。

                       UPDATE:更改某一行時激活觸發程序,例如通過UPDATE語句。

                       DELETE:從表中刪除某一行時激活觸發程序,例如,通過DELETE和REPLACE語句。這裏我們要注意trigger_event與以表操作方式激活觸發器程序的sql語句並不很類似,這點很重要。例如,關於INSERT的BEFORE觸發程序不僅能被INSERT程序激活,也能被LOAD DATA語句激活。


刪除觸發器:

       DROP TRIGGER [schema_name.]trigger_name

                如上是捨棄觸發器程序,方案名稱(schema_name)是可選的,如果省略了方案,將從當前方案中捨棄觸發程序。捨棄觸發器程序語句需要super權限。


上述我們提到了BEGIN...END語句,我們來說說他們的用法:

       在mysql中,BEGIN...END語句的語法爲:

BEGIN

[statement_list]

END

      其中,statement_list代表一個或多個語句的列表,列表內的每條語句都必須用;來結尾,而在mysql中分號是語句結束的標識符,遇到分號表示該段語句一結束,mysql可以開始執行了,因此,解釋器遇到statement_list中的分號後就開始執行,然後會報出錯誤,因爲沒有找到和BEGIN拼配的END.這時就會用到DELIMITER(定界符,分隔符的意思)命令,它是一條命令,不需要語句結束標識,語法爲:

        DELIMITER new_delemiter

        其中new_delemiter爲一個或多個長度的符號,默認的是分號,我們可以修改爲其他符號$:DELIMITER $.在這之後的語句以分號結束,解釋器不會有什麼反應,只有遇到了$才認爲是語句結束。注意,使用完之後,我們還得把它給改回來。

 

我們來看看一個具體的使用BEGIN...END的實例:

wKioL1dc6svD_9ASAACvZ4uzc_E106.png


接下來我們看一個創建觸發器的實例:

       我們假設系統中有兩個表:

              班級表:class(班級號 classID,班內學生數stuCount)

              學生表:student(學號 stuID,所屬班級號 calssID)

我們要創建觸發器來使班級表中的班內學生數隨着學生的添加自動更新,代碼如下:

       DELIMITER $

       create trigger tri_stuInsert after insert

       on student for each row

       begin

       declare c int;

       set c =(select stuCount from class where classID=new.classID);

       update class set stuCount =c+1 where classID =new.classID);

       end$

       DELIMITER ;

       我們來說說上面的變量。在mysql中,使用DECLARE來定義一局部變量,該變量只能在BEGIN...END複合語句中使用,並且應該定義在複合語句的開頭,也就是其他語句之前,語法是:declare var_name[...]type[DEFAULT value].其中,var_name爲變量名稱,同sql語句一樣,變量名不區分大小寫,type爲mysql支持的任何數據類型,可以同時定義多個同類型的變量,用逗號隔開,變量初始值爲NULL,如果需要可以使用DEFAULT子句提供默認值,值可以是一個表達式。對變量賦值採用set語句,語法爲:set val_name=expr[]...


我們在上述示例中還用到了NEW關鍵字,下面我們就來說說NEW和OLD關鍵字:

       在mysql中用他們來表示觸發器的所在表中,觸發了觸發器的那一行數據。

                在INSERT觸發器中,NEW用來表示將要(BEFORE)或已經(AFTER)插入的新數據

                在UPDATE型觸發器中,OLD用來表示將要或已經被修改的數據,NEW用來表示將要或已經修改爲的新數據

                在DELETE型觸發器中,OLD用來表示將要或已經被刪除的原數據

                使用方法是:new.columnName(columnName是相應的某一列名)

        另外,old是隻讀的,而new則可以在觸發器中使用set賦值,這樣不會再次觸發觸發器,造成循環調用(例如每插入一個學生前都在其學號前加“2016”)。


查看觸發器:

       查看觸發器是指數據庫中已存在的觸發器的定義,狀態,語法等信息。我們可以使用SHOW TRIGGERS 和在TRIGGERS表中查看觸發器信息。

              (1)SHOW TRIGGERS

              (2)在information_schema數據庫的TRIGGERS表中查看觸發器信息:

                                select * from 'information_schema'.'TRIGGERS' where 'TEIGGER_NAME'='ins_sum'


以上就是自己目前所交接觸發器的基本操作,隨着以後深入的瞭解,還會進一步學習觸發器。
































       
















      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章