觸發(fā)器是與表有關的數(shù)據(jù)庫對象,在滿足定義條件時觸發(fā),并執(zhí)行觸發(fā)器中定義的語句集合
創(chuàng)建觸發(fā)器
創(chuàng)建觸發(fā)器的語法如下:
create trigger trigger_name
trigger_time trigger_event on tbl_name
FOR EACH ROW
trigger_stmt
注意:觸發(fā)器只能創(chuàng)建在永久表(Permanent Table)上相寇,不能對臨時表(Temporary Table)創(chuàng)建觸發(fā)器
其中 trigger_time
是觸發(fā)器的觸發(fā)時間侨拦,可以是 before 或者 after,before 的含義指在檢查約束前觸發(fā)衬衬,而 after 是在檢查約束后觸發(fā)
而 trigger_event
就是觸發(fā)器的觸發(fā)事件,可以是 insert改橘,update 或者 delete
對同一個表相同觸發(fā)時間的相同觸發(fā)事件滋尉,只能定義一個觸發(fā)器
使用別名 old
和 new
來引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容
刪除觸發(fā)器
一次可以刪除一個觸發(fā)程序,如果沒有指定 schema_name
飞主,默認為當前數(shù)據(jù)庫,具體語法如下:
drop trigger [schema_name.]trigger_name
查看觸發(fā)器
可以通過執(zhí)行 show triggers
命令查看觸發(fā)器的狀態(tài)狮惜,語法等信息
另外一個查看方式是查詢系統(tǒng)表的 information_schema.triggers
表
觸發(fā)器的使用
觸發(fā)器執(zhí)行的語句有以下兩個限制
- 觸發(fā)程序不能調(diào)用將數(shù)據(jù)返回客戶端的存儲程序,也不能使用采用 call 語句的動態(tài) SQL語句碌识,但是允許存儲程序通過參數(shù)將數(shù)據(jù)返回觸發(fā)程序碾篡。也就是存儲過程或者函數(shù)通過 out 或者 inout 類型的參數(shù)將數(shù)據(jù)返回觸發(fā)器是可以的,但是不能調(diào)用直接返回數(shù)據(jù)的過程
- 不能在觸發(fā)器中使用以顯式或隱式方式開始或結(jié)束事務的語句筏餐,如 start transaction开泽,commit 或 rollback
MySQL 的觸發(fā)器是按照 before 觸發(fā)器,行操作魁瞪,after 觸發(fā)器的順序執(zhí)行的穆律,其中任何一步操作發(fā)生錯誤都不會繼續(xù)執(zhí)行剩下的操作。如果是對事務表進行的操作佩番,那么會整個作為一個事務被回滾(Rollback)众旗,但是如果是對非事務表進行的操作,那么已經(jīng)更新的記錄將無法回滾趟畏,這也是設計觸發(fā)器的時候需要注意的問題