Mysql基礎教程 mysql進階

Mysql觸發器的應用



什么是觸發器


觸發器是一種特殊的存儲過程,它在插入,刪除或修改特定表中的數據時觸發執行,它比數據庫本身標準的功能有更精細和更復雜的數據控制能力。它在修改我們的特定表的時候,它才會觸發,它不是用戶所調用的,而是數據庫自己去執行的。


它具有這樣的特性


監視地點:一般就是表名。


監視事件:update/delete/insert  //只有update/delete/insert的時候,我們才有可能去創建一個觸發器,除此之外,如果只是select語句的話,它是觸發不了我們的觸發語句的。


觸發時間:after/before  //它的含義就是在update之前還是之后去觸發觸發器,這個是由我們的觸發時間來控制的。


觸發事件:update/delete/insert   //到底是由于什么來引起這個觸發器,,一般來講,主要是由于update/delete/insert。


它不能直接被調用,是由數據庫主動去執行。



創建觸發器的語法


CREATE TRIGGER 語法
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt


觸發程序是與表有關的命名數據庫對象,當表上出現特定事件時,將激活該對象。觸發程序與命名為tbl_name的表相關。tbl_name必須引用永久性表。不能將觸發程序與TEMPORARY表或視圖關聯起來。


trigger_time


觸發程序的動作時間。它可以是BEFORE或AFTER,以指明觸發程序是在激活它的語句之前或之后觸發。


trigger_event


指明了激活觸發程序的語句的類型。trigger_event可以是下述值之一:INSERT:將新行插入表時激活觸發程序,例如,通過INSERT、LOAD DATA和REPLACE語句。UPDATE:更改某一行時激活觸發程序,例如,通過UPDATE語句。DELETE:從表中刪除某一行時激活觸發程序,例如,通過DELETE和REPLACE語句。請注意,trigger_event與以表操作方式激活觸發程序的SQL語句并不很類似,這點很重要。例如,關于INSERT的BEFORE觸發程序不僅能被INSERT語句激活,也能被LOAD DATA語句激活。可能會造成混淆的例子之一是INSERT INTO .. ON DUPLICATE UPDATE ...語法:BEFORE INSERT觸發程序對于每一行將激活,后跟AFTER INSERT觸發程序,或BEFORE UPDATE和AFTER UPDATE觸發程序,具體情況取決于行上是否有重復鍵。對于具有相同觸發程序動作時間和事件的給定表,不能有兩個觸發程序。例如,對于某一表,不能有兩個BEFORE UPDATE觸發程序。但可以有1個BEFORE UPDATE觸發程序和1個BEFOREINSERT觸發程序,或1個BEFORE UPDATE觸發程序和1個AFTER UPDATE觸發程序。


trigger_stmt


是當觸發程序激活時執行的語句。如果你打算執行多個語句,可使用BEGIN ... END復合語句結構。這樣,就能使用存儲子程序中允許的相同語句。


特別說明


1)對于insert而言,新插入的行用new來表示,行中的每一列的值用new.列名來表示;


2)對于delete而言,對于delete而言:原本有一行,后來被刪除,想引用被刪除的這一行,用old來表示,old.列名可以引用被刪除的行的值。



示例


創建一個簡單的觸發器,選擇數據庫。


0.png


查看表的結構,這里面有幾張表,有員工表,員工的收入表,一般情況下,我們會這樣去認為它,如果新增了一個員工,我們可以把新增的這個員工的薪資待遇初始化一個值。那實際上我們在插入的時候,是針對的employees這張表做一個觸發器,而這個觸發器最終會向我們的salaries這張表里插入一些數據。


1.png


我們觸發器里可能涉及多個分號,我們先修改一下分隔符。


2.png


重新啟動一個客戶端。


3.png


同樣使用這個數據庫。


4.png


查看salaries這張表里的數據結構,這里面我們要使用的是emp_no。


5.png


創建一個觸發器。


6.png


我們查看一下employees這張表,這里面有一個6098,我們可以插入一個6099。


7.png


我們再來查看一下salaries這張表,這里面只有3條數據。


8.png


我們向employees這張表中插入6099,出生日期為1992-1-1的jim數據。


9.png


那我們再來查看salaries這張表,這張表里插入的信息與我們剛才插入的信息一致。


90.png


通過這個案例我們了解了,我們的觸發器實際上是針對我們的employees這張表里面插入的時候我們做的觸發器,這個觸發器并不是我們顯示的去調用,而是當我們滿足插入的條件的時候,它回去自動執行,相當于這是個存儲過程,這個存儲過程是由我們數據庫子啊滿足一定的條件的時候,去同步執行的。


我們現在在這里面做一個刪除的觸發器,這個刪除的觸發器我么可以這樣考慮它,當我們把員工信息表里的數據刪除了,那么它所向關聯的工資信息也應該刪除,但這個刪除由于是主外鍵關聯,所以我們先刪除外鍵的,也就是先刪除salaries這張表之后,再刪除employees這個觸發器,然后再刪除employees這張表的相應的數據。所以這個觸發器應該是在刪除之前操作。


我們先來創建一個觸發器。


91.png


我們在員工信息表里去刪除6099這個數據。


92.png


這樣刪除之后,我們再來看看收入表里的數據。可以看到,6099已經被刪除了,我們沒有去主動刪除它,而是這個刪除實際上是滿足了刪除條件,滿足了刪除條件之后,它就會去刪除。這里面由于它是主外鍵關聯,我們一定要在刪除employees這張表之前,要先去把它的員工收入表給它刪掉,刪掉之后再做的一個刪除工作,這就是我們的刪除觸發器。


93.png



【本文由麥子學院獨家原創,轉載請注明出處并保留原文鏈接】

logo
? 2012-2016 www.jvbprd.live
蜀ICP備13014270號-4 Version 5.0.0 release20160127

免費領取價值1888元求職寶典!

客服熱線 400-862-8862

回到頂部

彩票安徽25选5