MySQL(六)觸發器的操作
阿新 • • 發佈:2019-02-01
1.為什麼使用觸發器:
在MySQL資料庫中,資料庫物件表是儲存和操作資料的邏輯結構,而資料庫物件觸發器則用來實現由一些表事件觸發的某個操作。在資料庫系統中,當執行表事件時,則會啟用觸發器,從而執行觸發器包含的操作。觸發器的操作包含建立、檢視、刪除。
觸發器是資料庫物件之一,該物件與程式語言 中的函式非常類似,都需要宣告、執行等。但是觸發器的執行不是由程式呼叫,也不是由手工啟動,而是由事件來觸發、啟用從而實現執行。例如:在學生表中有學生名字、學生總數字段,每當新增一條學生記錄時,學生的總數就必須同時改變。對於這個例項可以建立一個觸發器,每次新增一條學生記錄時,就執行一次計算學生總數的操作,這樣就可保證每次新增一條學生記錄後,學生總數和學生記錄數一致。MySQL中在觸發如下DELETE、INSERT、UPDATE語句時,就會自動執行所設定的操作,其他SQL語句則不會啟用觸發器。之所以會經常使用觸發器,是因為該物件能夠加強資料庫表中資料的完整性約束和業務規則等。
2.建立觸發器:
按照啟用觸發器時所執行的語句條目,可以將觸發器分為“一個執行語句的觸發器”和“多個執行語句的觸發器”
2.1 建立有一條執行語句的觸發器:
語法形式為:
create trigger trigger_name
before | after trigger_event
on table_name for each row trigger_stmt
//trigger_name 引數表示所要建立的觸發器的名字,觸發器的名字不能重複。建議觸發器的命名為trigger_xxx或者tri_xxx;
before和after引數指定了觸發器執行的時間,before :指在觸發器事件之前執行觸發器語句,after:指在觸發器事件之後執行觸發器語句;
trigger_event表示觸發事件,即觸發器執行條件,包delete、insert、update語句;table_name觸發事件操作表的名字;
for each row表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器;trigger_stmt表示啟用觸發器後被執行的語句。
示例:
create trigger tri_diaryteim
before insert on t_dept for each row
insert into t_diary values(null,'t_dept' ,now());
//功能說明:向部門表插入一條記錄之前向表t_diary插入當前時間記錄。
2.2 建立包含多條執行語句的觸發器:
語法形式如下:
create trigger trigger_name
before|after trigger_event
on table_name for each row
begin
trigger_stmt
end
//比“只有一條執行語句的觸發器”語法多了兩個關鍵字begin和end,在這兩個關鍵字之間是所要執行的多個執行語句的內容,執行語句之間用分號隔開。
在mysql中,一般情況下“;”符號作為語句的結束符號,可是在建立觸發器時,需要用到“;”符號作為執行語句的結束符號。
為了解決該問題,可以使用關鍵字DELIMITER語句,例如:"DELIMITER$$",可以用來將結束符號設定為“$$”.
示例:
DELIMITER $$
create trigger tri_diarytime2
after insert
on t_dept for each row
begin
insert into t_diary values(null,'t_dept',now());
insert into t_diary values(null,'t_dept',now());
end;$$
DELIMITER;
3.檢視觸發器:
3.1 通過SHOW TRIGGERS語句檢視觸發器:
語法為:
show triggers \G
3.2 通過檢視系統表triggers實現檢視觸發器:
操作語句為;
use information_schema;
select * from triggers \G
select * from triggers where trigger_name='tri_diarytime2' \G //檢視指定觸發器
3.刪除觸發器:
語法為:
drop trigger trigger_name;