目錄
一、觸發器是什麼?
是提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行(簡單的說就是:你執行一條sql語句,這條sql語句的執行會自動去觸發執行其他的sql語句)。觸發器經常用於加強數據的完整性約束和業務規則等。
主要作用是其能夠實現由主鍵和外鍵所不能保證的複雜的參照完整性和數據一致性。它能夠對數據庫中的相關表進行級聯修改,強制比CHECK約束更復雜的數據完整性,並自定義操作消息,維護非規範化數據以及比較數據修改前後的狀態。與CHECK約束不同,觸發器可以引用其它表中的列。在下列情況下使用觸發器實現複雜的引用完整性;強制數據間的完整性。創建多行觸發器,當插入,更新、刪除多行數據時,必須編寫一個處理多行數據的觸發器。執行級聯更新或級聯刪除這樣的動作。級聯修改數據庫中所有相關表。撤銷或者回滾違反引用完整性的操作,防止非法修改數據。
說了觸發器,那什麼是存儲過程呢?
存儲過程(Stored Procedure)是在大型數據庫系統中,一組爲了完成特定功能的SQL 語句集,它存儲在數據庫中,一次編譯後永久有效,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象。在數據量特別龐大的情況下利用存儲過程能達到倍速的效率提升。
觸發器與存儲過程的區別又是什麼呢?
觸發器與存儲過程的主要區別在於它們的運行方式。存儲過程必須有用戶、應用程序或者觸發器來顯示的調用並執行,而觸發器是當特定時間出現的時候,自動執行或者激活的,與連接用數據庫中的用戶、或者應用程序無關。當一行被插入、更新或者刪除時觸發器才執行,同時還取決於觸發器是怎樣創建的,當UPDATE發生時使用一個更新觸發器,當INSERT發生時使用一個插入觸發器,當DELETE發生時使用一個刪除觸發器。
想知道存儲過程與函數的區別嗎?歡迎來戳->存儲過程與函數的區別
二、觸發器的基本語法
1. 創建觸發器
drop trigger if exists databaseName.tri_Name;
create trigger tri_Name -- tri_Name代表觸發器名稱
tirgger_time trigger_event on tableName -- tirgger_time爲觸發時機,可選值有after/before,trigger_event爲觸發事件,可選值有insert/update/delete
for each row -- 這句話在mysql是固定的,表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器。
begin
sql語句;
end
2. 具體示例
INSERT類型觸發器
DROP TRIGGER `insert_tri`;
CREATE DEFINER=`root`@`localhost` TRIGGER `insert_tri` BEFORE INSERT ON `pgz_demo`
FOR EACH ROW BEGIN
SET NEW.PASSWORD = '123456'; -- NEW用來表示將要(before)或已經(after)插入的新數據。
END;
--該觸發器的意思是:對錶pgz_demo進行插入操作時,在執行插入之前把這條數據的PASSWORD字段值置爲'123456'
DELETE類型觸發器
CREATE TRIGGER `delete_tri` AFTER DELETE ON `pgz_demo`
FOR EACH ROW
BEGIN
DELETE FROM pgz_test WHERE id = old.usid; -- old用來表示將要或已經被刪除的原數據。
END
--該觸發器的意思是:對錶`pgz_demo`進行刪除操作時,在執行刪除之後同時刪除表`pgz_test`中字段id的值與`pgz_demo`表中刪除數據的usid相同的數據
UPDATE類型觸發器
CREATE TRIGGER update_tri BEFORE UPDATE ON pgz_demo FOR EACH ROW
BEGIN
SET new.version = old.version + 1; -- old用來表示將要或已經被修改的原數據,new用來表示將要或已經修改爲的新數據
END
查看觸發器
show triggers from databaseName;
刪除觸發器
drop trigger if exists databaseName.tri_Name;
三、異常場景
注意事項:
-
在觸發器後不允許更新新行
-
在對一個表中添加INSERT事件的觸發器中不能添加往當前表中新增數據的操作
-
對於一個表,具有相同操作時間和事件的多個觸發器(即:同一個表中不能有相同的觸發時機和觸發事件的觸發器)
錯誤示範:
1.在觸發器後不允許更新新行
CREATE TRIGGER `test_update_update` AFTER UPDATE ON `pgz_test` FOR EACH ROW
BEGIN
SET new.pid = 1; --在觸發器後不允許跟新新行
END
2.在對一個表中添加INSERT事件的觸發器中不能添加往當前表中新增數據的操作
CREATE TRIGGER `test_add_add` BEFORE INSERT ON `pgz_test`
FOR EACH ROW
BEGIN
INSERT INTO pgz_test VALUES(1, 2); --INSERT事件的觸發器進行了本表插入操作。
END