繼續接上一講,今天梳理一下數據庫中的觸發器的相關知識點。
一、觸發器的概念
1.1觸發器是什麼?
觸發器是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。關鍵詞:自動觸發。
1.2爲什麼要使用觸發器?
觸發器經常用於加強數據的完整性約束和業務規則等。
1.3 觸發器類型
後置觸發器 after
使用after定義的觸發器爲後觸發型的觸發器,只有在語句(引發觸發器執行的)指定的操作都已成功執行,後續才執行觸發器。該種觸發器涉及的場景較多,較爲常用。
ps:不能在視圖上定義AFTER觸發器。
前置觸發器 before
使用before 選項定義的觸發器爲前觸發型觸發器,在這種模式的觸發器中,先指定執行觸發器,而不是先執行語句。
舉個例子:用前觸發器實現:新插入職工數據時,其工資必須在相應工作的最低工資到最高工資之間。
二、觸發器的書寫格式
-- 觸發器 TRIGGER 代碼開發過程中,用的很少;數據體量較大時,儘量少用 -- 觸發器的書寫格式如下: create trigger 觸發器名稱 after/before insert/update/delete on 表名 begin -- 觸發器業務代碼 end
注意事項:
①觸發器名稱在數據庫中,是唯一的。
②for 作用 等同於 after。
③在一個表上,可以建立多個名稱不同、類型各異的觸發器、每個觸發器可由3個操作來引發。
三、觸發器的使用
3.1創建觸發器
最後點擊"保存"即可生效
3.2查看觸發器
剛剛創建好的觸發器,如何查看呢?
-- 查看觸發器 show TRIGGERS
3.3修改觸發器
-- 修改觸發器:alter trigger 觸發器名 ALTER trigger tri_age
3.4刪除觸發器
-- 刪除觸發器:drop trigeer 觸發器名 DROP trigger tri_age
四、其他問題答疑
①前置觸發器與後置觸發器的區別?
前置觸發器:before觸發器執行失敗,sql也會執行失敗;
後置觸發器:sql執行失敗時,after觸發器不會執行,sql會回滾;
②觸發器與存儲過程的區別?
觸發器:是特殊的存儲過程,是自動觸發。
存儲過程:由用戶、程序、或者觸發器 顯式調用。
③行級觸發器與語句級觸發器的區別?
行級觸發器:for each row (sql影響1行就觸發1次),需要對每一行數據做處理,使用行級觸發器。
語句級觸發器:for each statement (默認,1條sql觸發1次),語句執行完成後,做該語句的業務處理,用語句級別觸發器。
特別注意:
mysql不支持語句觸發器,所以必須寫for each row。
oracle觸發器中分行級觸發器和語句級觸發器,可不寫for each row,無論影響多少行都只執行一次。
④可以在視圖中創建after觸發器嗎?
不能