觸發(fā)器是與表有關(guān)的數(shù)據(jù)庫對(duì)象,在滿足定義條件時(shí)觸發(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)上,不能對(duì)臨時(shí)表(Temporary Table)創(chuàng)建觸發(fā)器
其中 trigger_time 是觸發(fā)器的觸發(fā)時(shí)間,可以是 before 或者 after,before 的含義指在檢查約束前觸發(fā),而 after 是在檢查約束后觸發(fā)
而 trigger_event 就是觸發(fā)器的觸發(fā)事件,可以是 insert,update 或者 delete
對(duì)同一個(gè)表相同觸發(fā)時(shí)間的相同觸發(fā)事件,只能定義一個(gè)觸發(fā)器
使用別名 old 和 new 來引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容
刪除觸發(fā)器
一次可以刪除一個(gè)觸發(fā)程序,如果沒有指定 schema_name,默認(rèn)為當(dāng)前數(shù)據(jù)庫,具體語法如下:
drop trigger [schema_name.]trigger_name
查看觸發(fā)器
可以通過執(zhí)行 show triggers 命令查看觸發(fā)器的狀態(tài),語法等信息
另外一個(gè)查看方式是查詢系統(tǒng)表的 information_schema.triggers 表
觸發(fā)器的使用
觸發(fā)器執(zhí)行的語句有以下兩個(gè)限制
- 觸發(fā)程序不能調(diào)用將數(shù)據(jù)返回客戶端的存儲(chǔ)程序,也不能使用采用 call 語句的動(dòng)態(tài) SQL語句,但是允許存儲(chǔ)程序通過參數(shù)將數(shù)據(jù)返回觸發(fā)程序。也就是存儲(chǔ)過程或者函數(shù)通過 out 或者 inout 類型的參數(shù)將數(shù)據(jù)返回觸發(fā)器是可以的,但是不能調(diào)用直接返回?cái)?shù)據(jù)的過程
- 不能在觸發(fā)器中使用以顯式或隱式方式開始或結(jié)束事務(wù)的語句,如 start transaction,commit 或 rollback
MySQL 的觸發(fā)器是按照 before 觸發(fā)器,行操作,after 觸發(fā)器的順序執(zhí)行的,其中任何一步操作發(fā)生錯(cuò)誤都不會(huì)繼續(xù)執(zhí)行剩下的操作。如果是對(duì)事務(wù)表進(jìn)行的操作,那么會(huì)整個(gè)作為一個(gè)事務(wù)被回滾(Rollback),但是如果是對(duì)非事務(wù)表進(jìn)行的操作,那么已經(jīng)更新的記錄將無法回滾,這也是設(shè)計(jì)觸發(fā)器的時(shí)候需要注意的問題