詳細(xì)解讀MySQL的觸發(fā)器trigger
什么是觸發(fā)器
MySQL的觸發(fā)器(trigger)和存儲過程一樣,都是嵌入到MySQL中的一段程序。觸發(fā)器是由事件來觸發(fā)某個操作,這些事件包括INSERT、UPDATE和DELETE語句。如果定義了觸發(fā)程序,當(dāng)數(shù)據(jù)庫執(zhí)行這些語句的時候就會激發(fā)觸發(fā)器執(zhí)行相應(yīng)的操作,觸發(fā)程序是與表有關(guān)的命名數(shù)據(jù)庫對象,當(dāng)表上出現(xiàn)特定事件時,將激活該對象。
創(chuàng)建觸發(fā)器
觸發(fā)器是個特殊的存儲過程,不同的是,執(zhí)行存儲過程要使用CALL語句來調(diào)用,而觸發(fā)器的執(zhí)行不需要使用CALL語句調(diào)用,也不需要手工啟動,只要當(dāng)一個預(yù)定義的事件發(fā)生的時候,就會被MySQL自動調(diào)用。比如對student表進(jìn)行操作(INSERT、DELETE或UPDATE)時就會激活它執(zhí)行。
觸發(fā)器可以查詢其他表,而且可以包含復(fù)雜的SQL語句。它們主要用于滿足復(fù)雜的業(yè)務(wù)規(guī)則或要求??梢詣?chuàng)建只有一條語句的觸發(fā)器,不過一般都是有多個執(zhí)行語句的觸發(fā)器用得比較多,即使單條語句的觸發(fā)器,也可以使用多條語句的觸發(fā)器的寫法來寫,看下有多個執(zhí)行語句的觸發(fā)器的基本寫法:
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
解釋一下:
1、trigger_name標(biāo)識觸發(fā)器名稱,用戶自行指定
2、trigger_time標(biāo)識觸發(fā)時機(jī),可以指定為before或after
3、trigger_event標(biāo)識觸發(fā)事件,包括INSERT、UPDATE和DELETE
4、tbl_name標(biāo)識建立觸發(fā)器的表名,即在哪張表上建立觸發(fā)器
5、trigger_stmt是觸發(fā)器程序體,觸發(fā)器程序可以使用begin和end作為開始和結(jié)束,中間包含多條語句
觸發(fā)器程序可以使用begin和end作為開始和結(jié)束,中間包含多條語句。舉個例子,還是以前的學(xué)生表:
create table student
(
studentId int primary key auto_increment not null,
studentName varchar(10) not null,
studentAge int,
studentPhone varchar(15)
)給學(xué)生表的studentName、studentAge、studentPhone三個字段都創(chuàng)建一個觸發(fā)器表:
create table triggerstudentname
(
t_studentName VARCHAR(10)
);
create table triggerstudentAge
(
t_studentAge int
);
create table triggerstudentPhone
(
t_studentPhone VARCHAR(15)
);創(chuàng)建一個觸發(fā)器,每次插入一條數(shù)據(jù)之后分別往三張表插字段:
CREATE TRIGGER trigger_student AFTER INSERT ON student
FOR EACH ROW
BEGIN
INSERT INTO triggerstudentname values(NEW.studentName);
INSERT INTO triggerstudentAge values(NEW.studentAge);
INSERT INTO triggerstudentPhone values(NEW.studentPhone);
END插入三條數(shù)據(jù):
insert into student values(null,'Jack', '11', '55555555'); insert into student values(null,'Dicky', '14', '66666666'); insert into student values(null,'Coco', '19', '77777777'); commit;
看一下三張表的情況:

沒什么問題,執(zhí)行結(jié)果顯示,在向student表插入數(shù)據(jù)的同時,triggerstudentname、triggerstudentAge和triggerstudentPhone三張表里面的數(shù)據(jù)都發(fā)生了變化,INSERT動作觸發(fā)了觸發(fā)器。
查看觸發(fā)器
查看觸發(fā)器是指查看數(shù)據(jù)庫中已存在的觸發(fā)器的定義、狀態(tài)和語法信息等??梢酝ㄟ^命令來查看已經(jīng)創(chuàng)建的觸發(fā)器,有兩種方式可以查看觸發(fā)器,一一講解。
1、SHOW TRIGGERS語句查看觸發(fā)器
通過SHOW TRIGGERS查看觸發(fā)器的語句如下:
SHOW TRIGGERS;
用這個命令來查看一下觸發(fā)器:
有一部分沒截取完整,解釋一下主要部分的含義:
(1)Trigger表示觸發(fā)器的名稱,這里有兩個觸發(fā)器分別是tri_student和trigger_student
(2)Event表示激活觸發(fā)器的事件,這里的兩個觸發(fā)事件為插入操作INSERT
(3)Table表示激活觸發(fā)器的操作對象表,這里都為student表
(4)Statement表示激活觸發(fā)器之后執(zhí)行的語句
(5)Timing表示觸發(fā)器觸發(fā)的時間,分別為插入操作之前(BEFORE)和插入操作之后(AFTER)
2、在triggers表中查看觸發(fā)器信息
SHOW TRIGGERS語句查看當(dāng)前創(chuàng)建的所有觸發(fā)器信息,這在觸發(fā)器較少的情況下,使用該語句會很方便,如果要查看特定的觸發(fā)器信息,可以直接從infomation_schema數(shù)據(jù)庫中的triggers表中查找,通過SELECT命令查看,基本語法為:
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE condition;
比如:
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME = 'trigger_student';
可以自己查看一下命令運(yùn)行的效果
刪除觸發(fā)器
使用DROP TRIGGER語句可以刪除MySQL中已經(jīng)定義的觸發(fā)器,刪除觸發(fā)器的基本語法為:
DROP TRIGGER [schema_name.]trigger_name;
schema_name表示數(shù)據(jù)庫名稱,是可選的,如果省略了schema_name,將從當(dāng)前數(shù)據(jù)庫中刪除觸發(fā)器,trigger_name是要刪除的觸發(fā)器的名稱,比如:
DROP TRIGGER school.tri_student
觸發(fā)器tri_student刪除成功
使用觸發(fā)器的注意點(diǎn)
在使用觸發(fā)器的時候需要注意:對于相同的表,相同的事件只能創(chuàng)建一個觸發(fā)器。
比如對表student創(chuàng)建了一個BEFORE INSERT觸發(fā)器,那么如果對表student再次創(chuàng)建一個BEFORE INSERT觸發(fā)器,MySQL將會報錯,此時,只可以在表student上創(chuàng)建AFTER INSERT或者BEFORE UPDATE類型的觸發(fā)器。靈活地運(yùn)用觸發(fā)器將為操作省去很多麻煩。
到此這篇關(guān)于詳細(xì)解讀MySQL的觸發(fā)器trigger的文章就介紹到這了,更多相關(guān)MySQL觸發(fā)器trigger內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows server2016安裝MySQL5.7.19解壓縮版教程詳解
本篇文章給大家記錄了MySQL 5.7.19 winx64解壓縮版安裝教程,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧2017-08-08
mysql跨服務(wù)查詢之FEDERATED存儲引擎的實(shí)現(xiàn)
本文主要介紹了mysql跨服務(wù)查詢之FEDERATED存儲引擎的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
MyEclipse連接MySQL數(shù)據(jù)庫圖文教程
這篇文章主要為大家詳細(xì)介紹了MyEclipse連接MySQL數(shù)據(jù)庫圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
mysql運(yùn)行net start mysql報服務(wù)名無效的解決辦法
這篇文章主要為大家詳細(xì)介紹了mysql運(yùn)行net start mysql報服務(wù)名無效的解決辦法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01

