詳解MySQL資料庫之觸發器

2022-09-24 20:39:10 字數 3142 閱讀 6602

本文是對mysql中觸發器的總結,從觸發器概念出發,結合例項對建立觸發器、使用觸發器、刪除觸發器進行介紹。

mysql觸發器和儲存過程一樣,都是嵌入到mysql的一段程式。觸發器是由事件來觸發某個操作,這些事件包括insert、update、delete。如果定義了觸發器,當資料庫執行這些語句的時候就會啟用觸發器執行相應的操作,觸發程式是與表有關的命令資料庫物件,當表上出現特定事件,將啟用該物件。

觸發器是乙個特殊的儲存過程,不同的是,執行儲存過程要使用call語句來呼叫,而觸發器的執行不需要用call來呼叫,也不需要手工啟動,只要當乙個預定義的事件發生,觸發器就會被mysql自動呼叫。觸發器可以查詢其他表,而且可以包含複雜的sql語句。

(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_trigg程式設計客棧er表:

tb_after_trigger表:

可以看到,在tb_student表執行insert操作後,另外兩個表也分別更新了記錄,tb_before_trigger表num值為0,證明在tb_student執行insert操作前插入的;tb_after_trigger表num值為1,證明在tb_student執行insert操作後插入的——這就是before與after的區別。

對於nutmmoxt其他條件觸發器,使用方法與示例1和示例2類似,本文不在演示。

(1)show triggers語句

通過show triggers語句可以檢視示例1和示例2中建立的觸發器:

show triggerswww.cppcns.com;

輸出結果:

(2)在triggers表中檢視觸發器

在information_schema資料庫的triggers表中存放在mysql資料庫中的所有觸發器,可以通過查詢語句進行檢視:

select * from information_schema.triggers where trigger_name = 'bewww.cppcns.comfore_trigger' ;

輸出結果:

當不指定查詢條件時,即是指檢視所有觸發器資訊。

使用drop trigger語句可以刪除觸發器,基本語法結構如下:

drop trigger [schema_name] trigger_name

其中,schema_name表示資料庫名稱,是可選引數,如果省略則表示從當前資料庫中刪除觸發器。

示例3:刪除示例1中建立的觸發器before_trigger

drop trigger before_trigger;

在某些時候,觸發器可以起到錦上添花的作用,但是,觸發器的效率並不高,所以還是盡量少用。

作者:奧辰

github:

mysql之觸發器詳解 MySQL之觸發器詳解

觸發器 trigger 監事某種情況,並出發某種操作。觸發器建立語法四要素 1 監視地點 table 2 監視事件 insert update delete 3 觸發時間 after before 4 觸發事件 insert update delete create trigger triggern...

資料庫 MySQL觸發器

觸發器 trigger 監視某種情況,並觸發某種操作。觸發器建立語法四要素 1.監視地點 table 2.監視事件 insert update delete 3.觸發時間 after before 4.觸發事件 insert update delete 語法 create trigger trigg...

資料庫之觸發器

觸發器 看到這個名字總是會想到數電中學過的觸發器,有輸入端和輸出端,根據電平的高低來觸發。資料庫中的觸發器是個特殊的儲存過程,主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名稱而被直接呼叫。作用 使用t sql語句進行複雜的邏輯處理,基於乙個表建立,但是可以對多個表進行操作,因此常常用...