目錄
- 1 引言
- 2 觸發(fā)器簡介
- 3創(chuàng)建觸發(fā)器
- 4 查看觸發(fā)器
- 5 刪除觸發(fā)器
- 6 總結(jié)
1 引言
本文是對MySQL中觸發(fā)器的總結(jié),從觸發(fā)器概念出發(fā),結(jié)合實(shí)例對創(chuàng)建觸發(fā)器、使用觸發(fā)器、刪除觸發(fā)器進(jìn)行介紹。
2 觸發(fā)器簡介
MySQL觸發(fā)器和存儲過程一樣,都是嵌入到MySQL的一段程序。觸發(fā)器是由事件來觸發(fā)某個(gè)操作,這些事件包括INSERT、UPDATE、DELETE。如果定義了觸發(fā)器,當(dāng)數(shù)據(jù)庫執(zhí)行這些語句的時(shí)候就會(huì)激活觸發(fā)器執(zhí)行相應(yīng)的操作,觸發(fā)程序是與表有關(guān)的命令數(shù)據(jù)庫對象,當(dāng)表上出現(xiàn)特定事件,將激活該對象。
觸發(fā)器是一個(gè)特殊的存儲過程,不同的是,執(zhí)行存儲過程要使用call語句來調(diào)用,而觸發(fā)器的執(zhí)行不需要用call來調(diào)用,也不需要手工啟動(dòng),只要當(dāng)一個(gè)預(yù)定義的事件發(fā)生,觸發(fā)器就會(huì)被MySQL自動(dòng)調(diào)用。觸發(fā)器可以查詢其他表,而且可以包含復(fù)雜的SQL語句。
3創(chuàng)建觸發(fā)器
?。?)創(chuàng)建只有一條執(zhí)行語句的觸發(fā)器
語法結(jié)構(gòu)如下:
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_stmt
trigger_name:用戶自定義的觸發(fā)器名稱;
trigger_time:標(biāo)識觸發(fā)事件,可以指定為before(時(shí)間發(fā)生前執(zhí)行)或after(事件發(fā)生后執(zhí)行);
trigger_event:標(biāo)識觸發(fā)事件,包括INSERT、UPDATE、DELETE;
table_name:觸發(fā)器建立在哪個(gè)表上;
trigger_stmt:觸發(fā)器執(zhí)行語句。
?。?)創(chuàng)建有多個(gè)執(zhí)行語句的觸發(fā)器
語法結(jié)構(gòu)如下:
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW
BEGIN
語句執(zhí)行列表
END
當(dāng)觸發(fā)器有至少一條的執(zhí)行語句時(shí),多條執(zhí)行語句需要用BEGIN和END包裹,分別表示整個(gè)代碼塊的開始和結(jié)束。
為演示觸發(fā)器操作,我們先創(chuàng)建一下三個(gè)數(shù)據(jù)表:
create table tb_student(
id int PRIMARY key auto_increment,
name varchar(10)
);
create table tb_before_trigger(
id int PRIMARY key auto_increment,
num int ,
time_now datetime NULL DEFAULT CURRENT_TIMESTAMP
);
create table tb_after_trigger(
id int PRIMARY key auto_increment,
num int ,
time_now datetime NULL DEFAULT CURRENT_TIMESTAMP
);
示例1:創(chuàng)建一個(gè)名為before_trigger的觸發(fā)器,該觸發(fā)器會(huì)在每次對表tb_student執(zhí)行insert操作前觸發(fā),觸發(fā)時(shí)會(huì)往before_trigger表插入一條包含tb_student表總記錄數(shù)的記錄。
delimiter //
create trigger before_trigger before insert
on tb_student for each row
begin
insert into tb_before_trigger (num) select count(*) from tb_student;
end
//
delimiter ;
示例2:創(chuàng)建一個(gè)名為after_trigger的觸發(fā)器,該觸發(fā)器會(huì)在每次對表tb_student執(zhí)行insert操作前觸發(fā),觸發(fā)時(shí)會(huì)向before_trigger表插入一條包含tb_student表總記錄數(shù)的記錄。
delimiter //
create trigger after_trigger after insert
on tb_student for each row
begin
insert into tb_after_trigger (num) select count(*) from tb_student;
end
//
delimiter ;
來測試一下示例1和示例2中創(chuàng)建的觸發(fā)器,往tb_student表中插入一條數(shù)據(jù)(插入前3個(gè)表沒有任何記錄):
insert into tb_student (name) values('zhangsan');
插入后,查看三個(gè)表中數(shù)據(jù):
tb_student表:
tb_before_trigger表:
tb_after_trigger表:
可以看到,在tb_student表執(zhí)行insert操作后,另外兩個(gè)表也分別更新了記錄,tb_before_trigger表num值為0,證明在tb_student執(zhí)行insert操作前插入的;tb_after_trigger表num值為1,證明在tb_student執(zhí)行insert操作后插入的——這就是before與after的區(qū)別。
對于其他條件觸發(fā)器,使用方法與示例1和示例2類似,本文不在演示。
4 查看觸發(fā)器
(1)show triggers語句
通過show triggers語句可以查看示例1和示例2中創(chuàng)建的觸發(fā)器:
輸出結(jié)果:
?。?)在triggers表中查看觸發(fā)器
在information_schema數(shù)據(jù)庫的triggers表中存放在MySQL數(shù)據(jù)庫中的所有觸發(fā)器,可以通過查詢語句進(jìn)行查看:
select * from information_schema.triggers where trigger_name = 'before_trigger' ;
輸出結(jié)果:
當(dāng)不指定查詢條件時(shí),即是指查看所有觸發(fā)器信息。
5 刪除觸發(fā)器
使用DROP TRIGGER語句可以刪除觸發(fā)器,基本語法結(jié)構(gòu)如下:
DROP TRIGGER [schema_name] trigger_name
其中,schema_name表示數(shù)據(jù)庫名稱,是可選參數(shù),如果省略則表示從當(dāng)前數(shù)據(jù)庫中刪除觸發(fā)器。
示例3:刪除示例1中創(chuàng)建的觸發(fā)器before_trigger
drop trigger before_trigger;
6 總結(jié)
在某些時(shí)候,觸發(fā)器可以起到錦上添花的作用,但是,觸發(fā)器的效率并不高,所以還是盡量少用。
作者:奧辰
Github:https://github.com/ChenHuabin321
以上就是詳解MySQL數(shù)據(jù)庫之觸發(fā)器的詳細(xì)內(nèi)容,更多關(guān)于MySQL 觸發(fā)器的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- Mysql觸發(fā)器在PHP項(xiàng)目中用來做信息備份、恢復(fù)和清空
- 一篇文章帶你深入了解Mysql觸發(fā)器
- MySQL觸發(fā)器的使用
- mysql 觸發(fā)器語法與應(yīng)用示例
- MySql視圖觸發(fā)器存儲過程詳解
- mysql觸發(fā)器實(shí)時(shí)檢測一條語句進(jìn)行備份刪除思路詳解