本文講述MySql5.x
中觸發(fā)器的使用,包括創(chuàng)建觸發(fā)器、刪除觸發(fā)器和查詢觸發(fā)器的相關(guān)知識(shí),對(duì)其語法、使用舉例和注意事項(xiàng)進(jìn)行了詳細(xì)說明。
一. 觸發(fā)器概述
觸發(fā)器是一種特殊類型的存儲(chǔ)過程,它主要是通過事件進(jìn)行觸發(fā)而被執(zhí)行的(存儲(chǔ)過程可以通過存儲(chǔ)過程名字而被直接調(diào)用)。
當(dāng)對(duì)某一表進(jìn)行諸如UPDATE、 INSERT、 DELETE 這些操作時(shí),就會(huì)自動(dòng)執(zhí)行觸發(fā)器所定義的SQL 語句。
觸發(fā)器的主要作用是實(shí)現(xiàn)由主鍵和外鍵所不能保證的復(fù)雜的參照完整性和數(shù)據(jù)的一致性。除此之外,觸發(fā)器還有其它許多不同的功能:
(1)強(qiáng)化約束
觸發(fā)器能夠?qū)崿F(xiàn)比CHECK 語句更為復(fù)雜的約束。
(2) 跟蹤變化
觸發(fā)器可以偵測(cè)數(shù)據(jù)庫內(nèi)的操作,從而不允許數(shù)據(jù)庫中未經(jīng)許可的指定更新和變化。
(3) 級(jí)聯(lián)運(yùn)行
觸發(fā)器可以偵測(cè)數(shù)據(jù)庫內(nèi)的操作,并自動(dòng)地級(jí)聯(lián)影響整個(gè)數(shù)據(jù)庫的各項(xiàng)內(nèi)容。例如,某個(gè)表上的觸發(fā)器中包含有對(duì)另外一個(gè)表的數(shù)據(jù)操作(如刪除,更新,插入)而該操作又導(dǎo)致該表上觸發(fā)器被觸發(fā)。
(4) 存儲(chǔ)過程的調(diào)用
為了響應(yīng)數(shù)據(jù)庫更,觸發(fā)器可以調(diào)用一個(gè)或多個(gè)存儲(chǔ)過程,甚至可以通過外部過程的調(diào)用而在DBMS( 數(shù)據(jù)庫管理系統(tǒng))本身之外進(jìn)行操作
總體而言,觸發(fā)器性能通常比較低。當(dāng)運(yùn)行觸發(fā)器時(shí),系統(tǒng)處理的大部分時(shí)間花費(fèi)在參照其它表的這一處理上,因?yàn)檫@些表既不在內(nèi)存中也不在數(shù)據(jù)庫設(shè)備上,而刪除表和插入表總是位于內(nèi)存中。可見觸發(fā)器所參照的其它表的位置決定了操作要花費(fèi)的時(shí)間長(zhǎng)短。
在實(shí)際的項(xiàng)目中,不推薦使用觸發(fā)器。
二. 創(chuàng)建觸發(fā)器——CREATE TRIGGER
1. 語法
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
觸發(fā)程序是與表有關(guān)的命名數(shù)據(jù)庫對(duì)象,當(dāng)表上出現(xiàn)特定事件時(shí),將激活該對(duì)象。
觸發(fā)程序與命名為tbl_name的表相關(guān),而且這個(gè)相關(guān)表必須引用永久性表,不能與臨時(shí)表或視圖關(guān)聯(lián)起來。
(1) trigger_name
觸發(fā)器的名稱。
(2) trigger_time
觸發(fā)器的動(dòng)作時(shí)間,可在事件之前(BEFORE)或事件之后(AFTER)。
(3) trigger_event
可為INSERT、UPDATE和DELETE,分別表示在插入、更新和刪除新行時(shí)激活觸發(fā)程序。
(4) tbl_name
與該觸發(fā)器相關(guān)的永久性表。
(5) trigger_stmt
觸發(fā)程序激活時(shí)執(zhí)行的語句。若有多個(gè)執(zhí)行語句時(shí),可使用BEGIN……END復(fù)合語句結(jié)構(gòu)。
2. 使用舉例
Eg1. 在本實(shí)例中用觸發(fā)器實(shí)現(xiàn)級(jí)聯(lián)刪除的效果。本實(shí)例創(chuàng)建兩個(gè)表:t_organization(組織表)和t_user(用戶表),其中用戶表的org_id與組織表的主鍵建立外鍵關(guān)聯(lián),因此,在刪除組織表中的某記錄時(shí),若用戶表存在關(guān)聯(lián)記錄時(shí),將會(huì)刪除失敗。觸發(fā)器trg_del_org_user用于在用戶刪除組織表的記錄前,首先刪除用戶表的對(duì)應(yīng)記錄,因此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用來更改結(jié)束符,上例中用“$$”作為結(jié)束符,“END$$”中的“$$”表示觸發(fā)器執(zhí)行結(jié)束,最后一句“delimiter ;”將結(jié)束符改成默認(rèn)的“;”。
3. 注意事項(xiàng)
(1)trigger_event能被LOAD DATE語句激活;
(2)不能對(duì)某個(gè)表具有兩個(gè)或多個(gè)具有相同的動(dòng)作時(shí)間和事件的觸發(fā)程序;
(3)觸發(fā)程序名稱存在于方案的名稱空間內(nèi),這意味著,在1個(gè)方案中,所有的觸發(fā)程序必須具有唯一的名稱。位于不同方案中的觸發(fā)程序可以具有相同的名稱;
(4)觸發(fā)程序不能調(diào)用將數(shù)據(jù)返回客戶端的存儲(chǔ)程序,也不能使用采用CALL語句的動(dòng)態(tài)SQL;
(5)觸發(fā)程序不能使用以顯式或隱式方式開始或結(jié)束事務(wù)的語句,如START TRANSACTION、COMMIT或ROLLBACK;
(6)在INSERT觸發(fā)程序中,僅能使用NEW.col_name,沒有舊行。在DELETE觸發(fā)程序中,僅能使用OLD.col_name,沒有新行。在UPDATE觸發(fā)程序中,可以使用OLD.col_name來引用更新前的某一行的列,也能使用NEW.col_name來引用更新后的行中的列;
(7)用OLD命名的列是只讀的。你可以引用它,但不能更改它。對(duì)于用NEW命名的列,如果具有SELECT權(quán)限,可引用它。在BEFORE觸發(fā)程序中,如果你具有UPDATE權(quán)限,可使用“SET NEW.col_name = value”更改它的值;
(8)在BEFORE觸發(fā)程序中,AUTO_INCREMENT列的NEW值為0,不是實(shí)際插入新記錄時(shí)將自動(dòng)生成的序列號(hào)。
三. 刪除觸發(fā)器——DROP TRIGGER
1. 語法
DROP TRIGGER [schema_name.]trigger_name
該語句用戶刪除觸發(fā)器,[schema_name.]用于指定所在的數(shù)據(jù)庫的名稱,若未加,則默認(rèn)為當(dāng)前選中的數(shù)據(jù)庫。
2. 使用舉例
Eg. 刪除在前面的小節(jié)中創(chuàng)建的觸發(fā)器trg_del_org_user:
DROP TRIGGER trg_del_org_user;
3. 注意事項(xiàng)
DROP TRIGGER語句需要SUPER權(quán)限。
四. 查詢觸發(fā)器——SHOW TRIGGERS
1. 語法
SHOW TRIGGERS;
該語句用于查詢觸發(fā)器。
2. 使用舉例
運(yùn)行: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參考手冊(cè)》
《觸發(fā)器概述》
觸發(fā)器小例子
posted on 2007-12-27 10:38
阿蜜果 閱讀(3228)
評(píng)論(0) 編輯 收藏 所屬分類:
MySql