真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

mysql之觸發(fā)器

       觸發(fā)器是一種 特殊的存儲(chǔ)過程,不同的是存儲(chǔ)過程要用CALL來調(diào)用,而觸發(fā)器不需要使用CALL也不需要手工啟動(dòng),只要當(dāng)一個(gè)預(yù)定義的事件發(fā)生時(shí),就會(huì)被MySQL自動(dòng)調(diào)用。它在插入,刪除或修改特定表中的數(shù)據(jù)時(shí)觸發(fā)執(zhí)行,它比數(shù)據(jù)庫(kù)本身的標(biāo)準(zhǔn)功能有更精細(xì)和更復(fù)雜的數(shù)據(jù)控制能力。它是一種與表操作有關(guān)的數(shù)據(jù)庫(kù)對(duì)象,當(dāng)觸發(fā)器所在表上出現(xiàn)指定事件時(shí),將調(diào)用該對(duì)象,即表的操作事件觸發(fā)表上的觸發(fā)器的執(zhí)行。

創(chuàng)新互聯(lián)建站主營(yíng)湘鄉(xiāng)網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都APP應(yīng)用開發(fā),湘鄉(xiāng)h5成都小程序開發(fā)搭建,湘鄉(xiāng)網(wǎng)站營(yíng)銷推廣歡迎湘鄉(xiāng)等地區(qū)企業(yè)咨詢

      

創(chuàng)建觸發(fā)器:

       創(chuàng)建觸發(fā)器語(yǔ)法如下:

              CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW tigger_stmt

       其中:

                trigger_name:標(biāo)識(shí)觸發(fā)器名稱,由用戶自定義

                trigger_time  :標(biāo)識(shí)觸發(fā)時(shí)機(jī),取值為BEFORE或AFTER,以指明觸發(fā)程序是在激活它的語(yǔ)句之前或之后觸發(fā)

                trigger_event:標(biāo)識(shí)觸發(fā)事件,取值為INSERT,UPDATE或DELETE

                tbl_name:標(biāo)識(shí)建立觸發(fā)器的表名,即在哪張表上建立觸發(fā)器

                trigger_stmt:觸發(fā)器程序體,可以是一句sql語(yǔ)句,或者用BEGIN和END包含的多條語(yǔ)句。觸發(fā)程序是與表有關(guān)的命名數(shù)據(jù)庫(kù)對(duì)象,當(dāng)表上出現(xiàn)特定事件時(shí),將激活該對(duì)象。觸發(fā)程序與命名為tbl_name的表相關(guān)。tbl_name必須引用永久性表。

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

  

接下來我們?cè)敿?xì)了解下trigger_event:

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

               LOAD DATA語(yǔ)句用于將一個(gè)文件裝入到一個(gè)數(shù)據(jù)表中,相當(dāng)于一系列的INSERT操作。

               REPLACE語(yǔ)句一般來說和INSERT語(yǔ)句很像,只是在表中有primary key或unique索引時(shí),如果插入的數(shù)據(jù)和原來primary key和unique索引一致時(shí),會(huì)先刪除原來的數(shù)據(jù),然后增加一條新數(shù)據(jù),也就是說,一條REPLACE語(yǔ)句有時(shí)等價(jià)于一條INSERT語(yǔ)句,有時(shí)候等價(jià)于一條DELETE語(yǔ)句加上一條INSERT語(yǔ)句。

              trigger_event指明了激活觸發(fā)程序的語(yǔ)句的類型,可以是下述值之一:

                       INSERT:將新行插入表時(shí)激活觸發(fā)器程序,例如通過INSERT,LOAD DATA,和REPLACE語(yǔ)句。

                       UPDATE:更改某一行時(shí)激活觸發(fā)程序,例如通過UPDATE語(yǔ)句。

                       DELETE:從表中刪除某一行時(shí)激活觸發(fā)程序,例如,通過DELETE和REPLACE語(yǔ)句。這里我們要注意trigger_event與以表操作方式激活觸發(fā)器程序的sql語(yǔ)句并不很類似,這點(diǎn)很重要。例如,關(guān)于INSERT的BEFORE觸發(fā)程序不僅能被INSERT程序激活,也能被LOAD DATA語(yǔ)句激活。

刪除觸發(fā)器:

       DROP TRIGGER [schema_name.]trigger_name

                如上是舍棄觸發(fā)器程序,方案名稱(schema_name)是可選的,如果省略了方案,將從當(dāng)前方案中舍棄觸發(fā)程序。舍棄觸發(fā)器程序語(yǔ)句需要super權(quán)限。

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

       在mysql中,BEGIN...END語(yǔ)句的語(yǔ)法為:

BEGIN

[statement_list]

END

      其中,statement_list代表一個(gè)或多個(gè)語(yǔ)句的列表,列表內(nèi)的每條語(yǔ)句都必須用;來結(jié)尾,而在mysql中分號(hào)是語(yǔ)句結(jié)束的標(biāo)識(shí)符,遇到分號(hào)表示該段語(yǔ)句一結(jié)束,mysql可以開始執(zhí)行了,因此,解釋器遇到statement_list中的分號(hào)后就開始執(zhí)行,然后會(huì)報(bào)出錯(cuò)誤,因?yàn)闆]有找到和BEGIN拼配的END.這時(shí)就會(huì)用到DELIMITER(定界符,分隔符的意思)命令,它是一條命令,不需要語(yǔ)句結(jié)束標(biāo)識(shí),語(yǔ)法為:

        DELIMITER new_delemiter

        其中new_delemiter為一個(gè)或多個(gè)長(zhǎng)度的符號(hào),默認(rèn)的是分號(hào),我們可以修改為其他符號(hào)$:DELIMITER $.在這之后的語(yǔ)句以分號(hào)結(jié)束,解釋器不會(huì)有什么反應(yīng),只有遇到了$才認(rèn)為是語(yǔ)句結(jié)束。注意,使用完之后,我們還得把它給改回來。

 

我們來看看一個(gè)具體的使用BEGIN...END的實(shí)例:

mysql之觸發(fā)器

接下來我們看一個(gè)創(chuàng)建觸發(fā)器的實(shí)例:

       我們假設(shè)系統(tǒng)中有兩個(gè)表:

              班級(jí)表:class(班級(jí)號(hào) classID,班內(nèi)學(xué)生數(shù)stuCount)

              學(xué)生表:student(學(xué)號(hào) stuID,所屬班級(jí)號(hào) calssID)

我們要?jiǎng)?chuàng)建觸發(fā)器來使班級(jí)表中的班內(nèi)學(xué)生數(shù)隨著學(xué)生的添加自動(dòng)更新,代碼如下:

       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復(fù)合語(yǔ)句中使用,并且應(yīng)該定義在復(fù)合語(yǔ)句的開頭,也就是其他語(yǔ)句之前,語(yǔ)法是:declare var_name[...]type[DEFAULT value].其中,var_name為變量名稱,同sql語(yǔ)句一樣,變量名不區(qū)分大小寫,type為mysql支持的任何數(shù)據(jù)類型,可以同時(shí)定義多個(gè)同類型的變量,用逗號(hào)隔開,變量初始值為NULL,如果需要可以使用DEFAULT子句提供默認(rèn)值,值可以是一個(gè)表達(dá)式。對(duì)變量賦值采用set語(yǔ)句,語(yǔ)法為:set val_name=expr[]...

我們?cè)谏鲜鍪纠羞€用到了NEW關(guān)鍵字,下面我們就來說說NEW和OLD關(guān)鍵字:

       在mysql中用他們來表示觸發(fā)器的所在表中,觸發(fā)了觸發(fā)器的那一行數(shù)據(jù)。

                在INSERT觸發(fā)器中,NEW用來表示將要(BEFORE)或已經(jīng)(AFTER)插入的新數(shù)據(jù)

                在UPDATE型觸發(fā)器中,OLD用來表示將要或已經(jīng)被修改的數(shù)據(jù),NEW用來表示將要或已經(jīng)修改為的新數(shù)據(jù)

                在DELETE型觸發(fā)器中,OLD用來表示將要或已經(jīng)被刪除的原數(shù)據(jù)

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

        另外,old是只讀的,而new則可以在觸發(fā)器中使用set賦值,這樣不會(huì)再次觸發(fā)觸發(fā)器,造成循環(huán)調(diào)用(例如每插入一個(gè)學(xué)生前都在其學(xué)號(hào)前加“2016”)。

查看觸發(fā)器:

       查看觸發(fā)器是指數(shù)據(jù)庫(kù)中已存在的觸發(fā)器的定義,狀態(tài),語(yǔ)法等信息。我們可以使用SHOW TRIGGERS 和在TRIGGERS表中查看觸發(fā)器信息。

              (1)SHOW TRIGGERS

              (2)在information_schema數(shù)據(jù)庫(kù)的TRIGGERS表中查看觸發(fā)器信息:

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


以上就是自己目前所交接觸發(fā)器的基本操作,隨著以后深入的了解,還會(huì)進(jìn)一步學(xué)習(xí)觸發(fā)器。


       

      


新聞標(biāo)題:mysql之觸發(fā)器
文章源于:http://weahome.cn/article/igipjc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部