觸發器
觸發器是由 INSERT,UPSET,DELETE等事件來觸發某種特定操作。
滿足觸發器的觸發條件時,數據庫系統就會執行觸發器中定義的程序語句。這樣可以保證操作的一致性。
example: 當學生表中新增了一個學生的信息時,學生人數的總數也應該增加,因此我們可以在這裏設置一個觸發器,當增加一個記錄時,執行一次計算人數的操作.
創建觸發器
1)創建只有一個執行語句的觸發器
create trigger 觸發器名 before|after 觸發事件 on 表名 for each row 執行語句;
eg:
創建一個由Insert操作觸發的觸發器。
create trigger trig_name before insert on trig_time for each row insert into trig_time values(now();
在向trig_name表中執行insert操作時,數據庫系統都會在insert之前向數據庫的trig_time表中插入當前時間。
2)創建有多個執行語句的觸發器
create trigger 觸發器名 before|after 觸發事件 on 表名
for each row
begin 執行語句列表 end;
不同的執行語句之間用分號隔開。但mysql默認情況下是以分號作爲結束執行語句的,爲了解決這個問題,我們引入delimiter.
delimiter &&可以將結束符變爲 &&,在創建完觸發器之後,我們可以可以用命令delimiter ;將結束符變爲分號。
eg:
delimiter &&
create trigger trig2 after insert on trig_table
for each row
begin
insert into trig_time values(‘13:36:00’);
insert into trig_time values(‘14:36:00’);
end&&
delimiter ;
在向trig_name表中執行insert操作時,數據庫系統都會在insert之後向數據庫的trig_time表中插入兩次當前時間。
從這個例子可以看出,觸發器可以同時執行多條執行語句。
MYSQL中一個表在相同觸發時間的相同觸發事件,只能創建一個觸發器。
查看觸發器
1)show triggers\G;
show triggers無法查詢指定的觸發器,顯示的是所有觸發器的信息。
如果觸發器很多時,不方便找到所需觸發器的信息。當觸發器較少時,可以使用show triggers語句。
2)在triggers中查看觸發器信息。
a)查看triggers表中的所有信息。
select * from information_schema.triggers;
b)查看triggers表中的指定的觸發器信息。
select * from information_schema.triggers where trigger_name=’觸發器名’;
觸發器的使用
在MYSQl中觸發器的執行順序是before觸發器,表操作(insert,delete,upset)和after觸發器。
在激活觸發器時,對觸發器的執行語句有一定的限制。例如觸發器中不能包括:start tranction,commit,rollback等關鍵詞,也不能包含call語句
在觸發器的執行過程中,任何步驟出錯都會阻止程序向下運行。對於普通表來說,已經被更新過表不能再回滾,更新後的數據繼續保持在表中。因此我們在設計觸發器的時候應該認真考慮。
刪除觸發器
drop trigger 觸發器名;
如果只指定觸發器名稱,那麼就會在當前數據庫下尋找該觸發器進行刪除。
如果同時指定了數據庫名稱,那麼就會到指定的數據庫下去尋找該觸發器刪除。drop trigger 數據庫名.觸發器名。
當我們不需要某些觸發器時,應及時刪除,否則有時執行語句會造成數據的變化。