本文是對MySQL中觸發器的總結,從觸發器概念出發,結合實例對創建觸發器、使用觸發器、刪除觸發器進行介紹。 ...
1 引言
本文是對MySQL中觸發器的總結,從觸發器概念出發,結合實例對創建觸發器、使用觸發器、刪除觸發器進行介紹。
2 觸發器簡介
MySQL觸發器和存儲過程一樣,都是嵌入到MySQL的一段程式。觸發器是由事件來觸發某個操作,這些事件包括INSERT、UPDATE、DELETE。如果定義了觸發器,當資料庫執行這些語句的時候就會激活觸發器執行相應的操作,觸發程式是與表有關的命令資料庫對象,當表上出現特定事件,將激活該對象。
觸發器是一個特殊的存儲過程,不同的是,執行存儲過程要使用call語句來調用,而觸發器的執行不需要用call來調用,也不需要手工啟動,只要當一個預定義的事件發生,觸發器就會被MySQL自動調用。觸發器可以查詢其他表,而且可以包含複雜的SQL語句。
3創建觸發器
(1)創建只有一條執行語句的觸發器
語法結構如下:
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_stmt
trigger_name:用戶自定義的觸發器名稱;
trigger_time:標識觸發事件,可以指定為before(時間發生前執行)或after(事件發生後執行);
trigger_event:標識觸發事件,包括INSERT、UPDATE、DELETE;
table_name:觸發器建立在哪個表上;
trigger_stmt:觸發器執行語句。
(2)創建有多個執行語句的觸發器
語法結構如下:
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW BEGIN 語句執行列表 END
當觸發器有至少一條的執行語句時,多條執行語句需要用BEGIN和END包裹,分別表示整個代碼塊的開始和結束。
為演示觸發器操作,我們先創建一下三個數據表:
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:創建一個名為before_trigger的觸發器,該觸發器會在每次對錶tb_student執行insert操作前觸發,觸發時會往before_trigger表插入一條包含tb_student表總記錄數的記錄。
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:創建一個名為after_trigger的觸發器,該觸發器會在每次對錶tb_student執行insert操作前觸發,觸發時會向before_trigger表插入一條包含tb_student表總記錄數的記錄。
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中創建的觸發器,往tb_student表中插入一條數據(插入前3個表沒有任何記錄):
insert into tb_student (name) values('zhangsan');
插入後,查看三個表中數據:
tb_student表:
tb_before_trigger表:
tb_after_trigger表:
可以看到,在tb_student表執行insert操作後,另外兩個表也分別更新了記錄,tb_before_trigger表num值為0,證明在tb_student執行insert操作前插入的;tb_after_trigger表num值為1,證明在tb_student執行insert操作後插入的——這就是before與after的區別。
對於其他條件觸發器,使用方法與示例1和示例2類似,本文不在演示。
4 查看觸發器
(1)show triggers語句
通過show triggers語句可以查看示例1和示例2中創建的觸發器:
show triggers;
輸出結果:
(2)在triggers表中查看觸發器
在information_schema資料庫的triggers表中存放在MySQL資料庫中的所有觸發器,可以通過查詢語句進行查看:
select * from information_schema.triggers where trigger_name = 'before_trigger' ;
輸出結果:
當不指定查詢條件時,即是指查看所有觸發器信息。
5 刪除觸發器
使用DROP TRIGGER語句可以刪除觸發器,基本語法結構如下:
DROP TRIGGER [schema_name] trigger_name
其中,schema_name表示資料庫名稱,是可選參數,如果省略則表示從當前資料庫中刪除觸發器。
示例3:刪除示例1中創建的觸發器before_trigger
drop trigger before_trigger;
6 總結
在某些時候,觸發器可以起到錦上添花的作用,但是,觸發器的效率並不高,所以還是儘量少用。