mysql觸發器
http://chenboqiang.blog.51cto.com/1068057/267415
本文講述MySql5.x中觸發器的使用,包括創建觸發器、刪除觸發器和查詢觸發器的相關知識,對其語法、使用舉例和注意事項進行了詳細說明。
一. 觸發器概述
觸發器是一種特殊類型的存儲過程,它主要是通過事件進行觸發而被執行的(存儲過程可以通過存儲過程名字而被直接調用)。
當對某一表進行諸如UPDATE、 INSERT、 DELETE 這些操作時,就會自動執行觸發器所定義的SQL 語句。
觸發器的主要作用是實現由主鍵和外鍵所不能保證的複雜的參照完整性和數據的一致性。除此之外,觸發器還有其它許多不同的功能:
(1)強化約束
觸發器能夠實現比CHECK 語句更爲複雜的約束。
(2) 跟蹤變化
觸發器可以偵測數據庫內的操作,從而不允許數據庫中未經許可的指定更新和變化。
(3) 級聯運行
觸發器可以偵測數據庫內的操作,並自動地級聯影響整個數據庫的各項內容。例如,某個表上的觸發器中包含有對另外一個表的數據操作(如刪除,更新,插入)而該操作又導致該表上觸發器被觸發。
(4) 存儲過程的調用
爲了響應數據庫更,觸發器可以調用一個或多個存儲過程,甚至可以通過外部過程的調用而在DBMS( 數據庫管理系統)本身之外進行操作
總體而言,觸發器性能通常比較低。當運行觸發器時,系統處理的大部分時間花費在參照其它表的這一處理上,因爲這些表既不在內存中也不在數據庫設備上,而刪除表和插入表總是位於內存中。可見觸發器所參照的其它表的位置決定了操作要花費的時間長短。
在實際的項目中,不推薦使用觸發器。
二. 創建觸發器——CREATE TRIGGER
1. 語法
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
觸發程序是與表有關的命名數據庫對象,當表上出現特定事件時,將激活該對象。
觸發程序與命名爲tbl_name的表相關,而且這個相關表必須引用永久性表,不能與臨時表或視圖關聯起來。
(1) trigger_name
觸發器的名稱。
(2) trigger_time
觸發器的動作時間,可在事件之前(BEFORE)或事件之後(AFTER)。
(3) trigger_event
可爲INSERT、UPDATE和DELETE,分別表示在插入、更新和刪除新行時激活觸發程序。
(4) tbl_name
與該觸發器相關的永久性表。
(5) trigger_stmt
觸發程序激活時執行的語句。若有多個執行語句時,可使用BEGIN……END複合語句結構。
2. 使用舉例
Eg1. 在本實例中用觸發器實現級聯刪除的效果。本實例創建兩個表:t_organization(組織表)和t_user(用戶表),其中用戶表的org_id與組織表的主鍵建立外鍵關聯,因此,在刪除組織表中的某記錄時,若用戶表存在關聯記錄時,將會刪除失敗。觸發器trg_del_org_user用於在用戶刪除組織表的記錄前,首先刪除用戶表的對應記錄,因此trigger_time爲BEFORE,trigger_event爲DELETE。
DROP TABLE IF EXISTS t_user;
DROP TABLE IF EXISTS t_organization;
CREATE TABLE t_organization
(
org_id INT NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
description VARCHAR(255),
gen_time DATETIME NOT NULL
);
INSERT INTO t_organization VALUES(1, 'test ', NULL, NOW());
CREATE TABLE t_user
(
user_id VARCHAR(50) NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
org_id INT NOT NULL,
description VARCHAR(255),
gen_time DATETIME NOT NULL,
constraint fk_org_id_user_org foreign key (org_id)
references t_organization (org_id) on delete restrict on update restrict
);
INSERT INTO t_user VALUES('amigo ', 'xiexingxing', 1, NULL, NOW());
delimiter $$
CREATE TRIGGER trg_del_org_user BEFORE DELETE ON t_organization
FOR EACH ROW BEGIN
DELETE FROM t_user WHERE t_user.org_id = OLD.org_id;
END$$
delimiter ;
其中delimiter用來更改結束符,上例中用“$$”作爲結束符,“END$$”中的“$$”表示觸發器執行結束,最後一句“delimiter ;”將結束符改成默認的“;”。
3. 注意事項
(1)trigger_event能被LOAD DATE語句激活;
(2)不能對某個表具有兩個或多個具有相同的動作時間和事件的觸發程序;
(3)觸發程序名稱存在於方案的名稱空間內,這意味着,在1個方案中,所有的觸發程序必須具有唯一的名稱。位於不同方案中的觸發程序可以具有相同的名稱;
(4)觸發程序不能調用將數據返回客戶端的存儲程序,也不能使用採用CALL語句的動態SQL;
(5)觸發程序不能使用以顯式或隱式方式開始或結束事務的語句,如START TRANSACTION、COMMIT或ROLLBACK;
(6)在INSERT觸發程序中,僅能使用NEW.col_name,沒有舊行。在DELETE觸發程序中,僅能使用OLD.col_name,沒有新行。在UPDATE觸發程序中,可以使用OLD.col_name來引用更新前的某一行的列,也能使用NEW.col_name來引用更新後的行中的列;
(7)用OLD命名的列是隻讀的。你可以引用它,但不能更改它。對於用NEW命名的列,如果具有SELECT權限,可引用它。在BEFORE觸發程序中,如果你具有UPDATE權限,可使用“SET NEW.col_name = value”更改它的值;
(8)在BEFORE觸發程序中,AUTO_INCREMENT列的NEW值爲0,不是實際插入新記錄時將自動生成的序列號。
三. 刪除觸發器——DROP TRIGGER
1. 語法
DROP TRIGGER [schema_name.]trigger_name
該語句用戶刪除觸發器,[schema_name.]用於指定所在的數據庫的名稱,若未加,則默認爲當前選中的數據庫。
2. 使用舉例
Eg. 刪除在前面的小節中創建的觸發器trg_del_org_user:
DROP TRIGGER trg_del_org_user;
3. 注意事項
DROP TRIGGER語句需要SUPER權限。
四. 查詢觸發器——SHOW TRIGGERS
1. 語法
SHOW TRIGGERS;
該語句用於查詢觸發器。
2. 使用舉例
運行:SHOW TRIGGERS;
輸出的主要信息如下:
| Trigger | Event | Table | Statement | Timing | Created | sql_mode
| trg_del_org_user | DELETE | t_organization | BEGIN
DELETE FROM t_user WHERE t_user.org_id = OLD.org_id;
END | BEFORE | NULL | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBST
ITUTION |
參考文章:《MySql5.1參考手冊》
觸發器小例子