觸發(fā)器是一種與表操作有關(guān)的數(shù)據(jù)庫對象。當(dāng)有觸發(fā)器的數(shù)據(jù)表上出現(xiàn)指定事件時,將調(diào)用該觸發(fā)器對象,即表上的操作事件觸發(fā)表上的觸發(fā)器執(zhí)行。能決定觸發(fā)器執(zhí)行某個操作的事件有:(insert)插入語句、(update)更新語句和(delete)刪除語句。使用觸發(fā)器可以保證某些操作之間的一致性。
MySQL創(chuàng)建一個執(zhí)行語句的觸發(fā)器:

trigger_name:觸發(fā)器名稱,可以自己定義;
trigger_time:觸發(fā)時機(jī),有兩個取值BEFORE|AFTER,指定觸發(fā)器執(zhí)行的時間。
trigger_event:觸發(fā)事件,取值包括INSERT UPDATE和DELETE。
tbl_name:建立觸發(fā)器的數(shù)據(jù)表的名稱,即在哪張表上建立觸發(fā)器。
FOR EACH ROW:表示任何一條滿足觸發(fā)條件的記錄上的操作都會觸發(fā)觸發(fā)器。
trigger_stmt:觸發(fā)器程序體,指觸發(fā)器被觸發(fā)后執(zhí)行的程序,可以是一條SQL語句,也可以是BEGIN和END包含的多條語句。
需要注意的是不能在同一張表上建立2種同類型的觸發(fā)器,一張表最多創(chuàng)建6個觸發(fā)器(6種類型):即BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。
觸發(fā)事件:MySQL除了對insert update delete基本操作進(jìn)行定義外,還定義了load data和replace語句,這兩種語句也能觸發(fā)以上6種類型的觸發(fā)器的觸發(fā)。
LOAD DATA 語句將一個文件裝入到一個數(shù)據(jù)表中,相當(dāng)與是一系列的 INSERT 操作。
replace和insert語句也很像,只是在表中有 primary key 或 unique 索引時,如果插入的數(shù)據(jù)和原來 primary?key 或 unique 索引一致時,會先刪除原來的數(shù)據(jù),然后增加一條新數(shù)據(jù),也就是說,一條 REPLACE 語句有時候等價于一條。
INSERT觸發(fā)器:插入某一行時激活觸發(fā)器,可能通過 INSERT、LOAD DATA、REPLACE 語句觸發(fā);
UPDATE觸發(fā)器:更改某一行時激活觸發(fā)器,可能通過 UPDATE 語句觸發(fā);
DELETE觸發(fā)器:刪除某一行時激活觸發(fā)器,可能通過 DELETE、REPLACE 語句觸發(fā)。
BEGIN … END 語句
語句格式:BEGIN? ?statement...list? ?END
statement_list 代表一個或多個語句的列表,列表內(nèi)的每條語句都必須用分號(;)來結(jié)尾。
觸發(fā)器示例:
使用Navicat 數(shù)據(jù)庫管理工具管理的數(shù)據(jù)庫,在某張數(shù)據(jù)表上建立觸發(fā)器,首先找到要建立觸發(fā)器的表,選擇打開設(shè)計(jì)該表會看下如下圖,然后點(diǎn)擊上方Triggers(觸發(fā)器),點(diǎn)擊左下方的+,創(chuàng)建觸發(fā)器,輸入觸發(fā)器的名稱(Name),觸發(fā)時機(jī)(Fires),觸發(fā)操作(如下所示有insert update delete三個選項(xiàng))。最后在statement中寫入觸發(fā)器程序體。點(diǎn)擊Save保存,一個觸發(fā)器就創(chuàng)建好了。

然后對創(chuàng)建觸發(fā)器的表執(zhí)行一條插入語句,觸發(fā)此觸發(fā)器,觸發(fā)器會執(zhí)行程序體,就是statement中的SQL語句。


NEW 與 OLD
上述示例中使用了NEW關(guān)鍵字,和 MS SQL Server 中的 INSERTED 和 DELETED 類似,MySQL 中定義了 NEW 和 OLD,用來表示觸發(fā)器的所在表中,觸發(fā)了觸發(fā)器的那一行數(shù)據(jù)。具體:
在 INSERT 型觸發(fā)器中,NEW 用來表示將要(BEFORE)或已經(jīng)(AFTER)插入的新數(shù)據(jù);
在 UPDATE 型觸發(fā)器中,OLD 用來表示將要或已經(jīng)被修改的原數(shù)據(jù),NEW 用來表示將要或已經(jīng)修改為的新數(shù)據(jù);
在 DELETE 型觸發(fā)器中,OLD 用來表示將要或已經(jīng)被刪除的原數(shù)據(jù);
使用方法: NEW.columnName (columnName 為相應(yīng)數(shù)據(jù)表某一列名)
另外,OLD 是只讀的,而 NEW 則可以在觸發(fā)器中使用 SET 賦值,這樣不會再次觸發(fā)觸發(fā)器,造成循環(huán)調(diào)用。需注意:觸發(fā)器不可以循環(huán)調(diào)用。
查看觸發(fā)器

刪除觸發(fā)器
drop trigger 觸發(fā)器名。
觸發(fā)器名參數(shù)如果指指定名稱會在當(dāng)前數(shù)據(jù)庫下查找該觸發(fā)器,如果找到就刪除。如果指定數(shù)據(jù)庫,數(shù)據(jù)庫系統(tǒng)會到指定的數(shù)據(jù)庫下去查找觸發(fā)器。
如果不再需要某觸發(fā)器,一定要將該觸發(fā)器刪除。

觸發(fā)器的執(zhí)行順序
我們建立的數(shù)據(jù)庫一般都是 InnoDB 數(shù)據(jù)庫,其上建立的表是事務(wù)性表,也就是事務(wù)安全的。這時,若SQL語句或觸發(fā)器執(zhí)行失敗,MySQL 會回滾事務(wù),有:
①如果 BEFORE 觸發(fā)器執(zhí)行失敗,SQL 無法正確執(zhí)行。
②SQL 執(zhí)行失敗時,AFTER 型觸發(fā)器不會觸發(fā)。
③AFTER 類型的觸發(fā)器執(zhí)行失敗,SQL 會回滾。