更新時(shí)間:2021-07-15 16:20:26 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1155次
MySQL包含對(duì)觸發(fā)器的支持。觸發(fā)器是一種與表操作有關(guān)的數(shù)據(jù)庫(kù)對(duì)象,當(dāng)觸發(fā)器所在表上出現(xiàn)指定事件時(shí),將調(diào)用該對(duì)象,即表的操作事件觸發(fā)表上的觸發(fā)器的執(zhí)行。
在MySQL中,創(chuàng)建觸發(fā)器語(yǔ)法如下:
CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt
其中:
trigger_name:標(biāo)識(shí)觸發(fā)器名稱(chēng),用戶(hù)自行指定;
trigger_time:標(biāo)識(shí)觸發(fā)時(shí)機(jī),取值為BEFORE或AFTER;
trigger_event:標(biāo)識(shí)觸發(fā)事件,取值為INSERT、UPDATE或DELETE;
tbl_name:標(biāo)識(shí)建立觸發(fā)器的表名,即在哪張表上建立觸發(fā)器;
trigger_stmt:觸發(fā)器程序體,可以是一句SQL語(yǔ)句,或者用BEGIN和END包含的多條語(yǔ)句。
由此可見(jiàn),可以建立6種觸發(fā)器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。
另外有一個(gè)限制是不能同時(shí)在一個(gè)表上建立2個(gè)相同類(lèi)型的觸發(fā)器,因此在一個(gè)表上最多建立6個(gè)觸發(fā)器。
MySQL除了對(duì)INSERT、UPDATE、DELETE基本操作進(jìn)行定義外,還定義了LOAD DATA和REPLACE語(yǔ)句,這兩種語(yǔ)句也能引起上述6中類(lèi)型的觸發(fā)器的觸發(fā)。
LOAD DATA語(yǔ)句用于將一個(gè)文件裝入到一個(gè)數(shù)據(jù)表中,相當(dāng)與一系列的INSERT操作。
REPLACE語(yǔ)句一般來(lái)說(shuō)和INSERT語(yǔ)句很像,只是在表中有primary key或unique索引時(shí),如果插入的數(shù)據(jù)和原來(lái)primary key或unique索引一致時(shí),會(huì)先刪除原來(lái)的數(shù)據(jù),然后增加一條新數(shù)據(jù),也就是說(shuō),一條REPLACE語(yǔ)句有時(shí)候等價(jià)于一條。
INSERT語(yǔ)句,有時(shí)候等價(jià)于一條DELETE語(yǔ)句加上一條INSERT語(yǔ)句。
INSERT型觸發(fā)器:插入某一行時(shí)激活觸發(fā)器,可能通過(guò)INSERT、LOAD DATA、REPLACE語(yǔ)句觸發(fā);
UPDATE型觸發(fā)器:更改某一行時(shí)激活觸發(fā)器,可能通過(guò)UPDATE語(yǔ)句觸發(fā);
DELETE型觸發(fā)器:刪除某一行時(shí)激活觸發(fā)器,可能通過(guò)DELETE、REPLACE語(yǔ)句觸發(fā)。
在MySQL中,BEGIN…END語(yǔ)句的語(yǔ)法為:
BEGIN
[statement_list]
END
其中,statement_list代表一個(gè)或多個(gè)語(yǔ)句的列表,列表內(nèi)的每條語(yǔ)句都必須用分號(hào)(;)來(lái)結(jié)尾。
而在MySQL中,分號(hào)是語(yǔ)句結(jié)束的標(biāo)識(shí)符,遇到分號(hào)表示該段語(yǔ)句已經(jīng)結(jié)束,MySQL可以開(kāi)始執(zhí)行了。因此,解釋器遇到statement_list中的分號(hào)后就開(kāi)始執(zhí)行,然后會(huì)報(bào)出錯(cuò)誤,因?yàn)闆](méi)有找到和BEGIN匹配的END。
這時(shí)就會(huì)用到DELIMITER命令(DELIMITER是定界符,分隔符的意思),它是一條命令,不需要語(yǔ)句結(jié)束標(biāo)識(shí),語(yǔ)法為:
DELIMITER new_delemiter
new_delemiter可以設(shè)為1個(gè)或多個(gè)長(zhǎng)度的符號(hào),默認(rèn)的是分號(hào)(;),我們可以把它修改為其他符號(hào),如$:
DELIMITER$
在這之后的語(yǔ)句,以分號(hào)結(jié)束,解釋器不會(huì)有什么反應(yīng),只有遇到了$,才認(rèn)為是語(yǔ)句結(jié)束。注意,使用完之后,我們還應(yīng)該記得把它給修改回來(lái)。
假設(shè)系統(tǒng)中有兩個(gè)表:
班級(jí)表class(班級(jí)號(hào)classID,班內(nèi)學(xué)生數(shù)stuCount)
學(xué)生表student(學(xué)號(hào)stuID,所屬班級(jí)號(hào)classID)
要?jiǎng)?chuàng)建觸發(fā)器來(lái)使班級(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來(lái)定義一局部變量,該變量只能在BEGIN…END復(fù)合語(yǔ)句中使用,并且應(yīng)該定義在復(fù)合語(yǔ)句的開(kāi)頭,
即其它語(yǔ)句之前,語(yǔ)法如下:
DECLARE var_name[,...] type [DEFAULT value]
其中:
var_name為變量名稱(chēng),同SQL語(yǔ)句一樣,變量名不區(qū)分大小寫(xiě);type為MySQL支持的任何數(shù)據(jù)類(lèi)型;可以同時(shí)定義多個(gè)同類(lèi)型的變量,用逗號(hào)隔開(kāi);變量初始值為NULL,如果需要,可以使用DEFAULT子句提供默認(rèn)值,值可以被指定為一個(gè)表達(dá)式。
對(duì)變量賦值采用SET語(yǔ)句,語(yǔ)法為:
SET var_name = expr [,var_name = expr] ...
上述示例中使用了NEW關(guān)鍵字,和MS SQL Server中的INSERTED和DELETED類(lèi)似,MySQL中定義了NEW和OLD,用來(lái)表示
觸發(fā)器的所在表中,觸發(fā)了觸發(fā)器的那一行數(shù)據(jù)。
具體地:
在INSERT型觸發(fā)器中,NEW用來(lái)表示將要(BEFORE)或已經(jīng)(AFTER)插入的新數(shù)據(jù);
在UPDATE型觸發(fā)器中,OLD用來(lái)表示將要或已經(jīng)被修改的原數(shù)據(jù),NEW用來(lái)表示將要或已經(jīng)修改為的新數(shù)據(jù);
在DELETE型觸發(fā)器中,OLD用來(lái)表示將要或已經(jīng)被刪除的原數(shù)據(jù);
使用方法:NEW.columnName(columnName為相應(yīng)數(shù)據(jù)表某一列名)
另外,OLD是只讀的,而NEW則可以在觸發(fā)器中使用SET賦值,這樣不會(huì)再次觸發(fā)觸發(fā)器,造成循環(huán)調(diào)用(如每插入一個(gè)學(xué)生前,都在其學(xué)號(hào)前加“2013”)。
和查看數(shù)據(jù)庫(kù)(show databases;)查看表格(show tables;)一樣,查看觸發(fā)器的語(yǔ)法如下:
SHOW TRIGGERS [FROM schema_name];
其中,schema_name 即 Schema 的名稱(chēng),在 MySQL 中 Schema 和 Database 是一樣的,也就是說(shuō),可以指定數(shù)據(jù)庫(kù)名,這樣就
不必先“USE database_name;”了。
和刪除數(shù)據(jù)庫(kù)、刪除表格一樣,刪除觸發(fā)器的語(yǔ)法如下:
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
觸發(fā)器的執(zhí)行順序
我們建立的數(shù)據(jù)庫(kù)一般都是InnoDB數(shù)據(jù)庫(kù),其上建立的表是事務(wù)性表,也就是事務(wù)安全的。這時(shí),若SQL語(yǔ)句或觸發(fā)器執(zhí)行失敗,MySQL會(huì)回滾事務(wù),有:
以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"MySQL觸發(fā)器的學(xué)習(xí)",希望對(duì)大家有幫助,想了解更多可查看MySQL教程。動(dòng)力節(jié)點(diǎn)在線(xiàn)學(xué)習(xí)教程,針對(duì)沒(méi)有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門(mén)到精通,主要介紹了一些Java基礎(chǔ)的核心知識(shí),讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743