abstract:觸發(fā)器是由事件來觸發(fā)某個(gè)操作。這些事件包括INSERT語句、UPDATE語句和DELETE語句。當(dāng)數(shù)據(jù)庫(kù)系統(tǒng)執(zhí)行這些事件時(shí),就會(huì)激活觸發(fā)器執(zhí)行相應(yīng)的操作。創(chuàng)建MySQL觸發(fā)器在MySQL中,創(chuàng)建只有一個(gè)執(zhí)行語句的觸發(fā)器的基本形式如下:CREATE TRIGGER 觸發(fā)器名 BEFORE|AFTER 觸發(fā)事件 ON 表名 FOR EACH ROW 執(zhí)行語句具體的參數(shù)說明如下:觸發(fā)器名:指定要?jiǎng)?chuàng)建的觸
觸發(fā)器是由事件來觸發(fā)某個(gè)操作。這些事件包括INSERT語句、UPDATE語句和DELETE語句。當(dāng)數(shù)據(jù)庫(kù)系統(tǒng)執(zhí)行這些事件時(shí),就會(huì)激活觸發(fā)器執(zhí)行相應(yīng)的操作。
創(chuàng)建MySQL觸發(fā)器
在MySQL中,創(chuàng)建只有一個(gè)執(zhí)行語句的觸發(fā)器的基本形式如下:
CREATE TRIGGER 觸發(fā)器名 BEFORE|AFTER 觸發(fā)事件 ON 表名 FOR EACH ROW 執(zhí)行語句
具體的參數(shù)說明如下:
觸發(fā)器名:指定要?jiǎng)?chuàng)建的觸發(fā)器名字。
參數(shù)BEFORE和AFTER:指定觸發(fā)器執(zhí)行的時(shí)間。BEFORE指在觸發(fā)時(shí)間之前執(zhí)行觸發(fā)語句;AFTER表示在觸發(fā)時(shí)間之后執(zhí)行觸發(fā)語句。
觸發(fā)事件:指數(shù)據(jù)庫(kù)操作觸發(fā)條件,其中,包括INSERT,UPDATE和DELETE。
表名:指定觸發(fā)時(shí)間操作表的名稱。
FOR EACH ROW:表示任何一條記錄上的操作滿足觸發(fā)事件都會(huì)觸發(fā)該觸發(fā)器。
delimiter// create trigger auto_save_time before insert on studentinfo for each row insert into timelog(savetime)values(now()); //在向studentinfo表中插入數(shù)據(jù)時(shí),savetime表中也會(huì)被插入一條當(dāng)前系統(tǒng)時(shí)間的數(shù)據(jù)。
創(chuàng)建具有多個(gè)執(zhí)行語句的觸發(fā)器
CREATE TRIGGER 觸發(fā)器名稱 BEFORE|AFTER 觸發(fā)事件 ON 表名 FOR EACH ROW
BEGIN
執(zhí)行語句列表;
END
delimiter// create trigger delete_time_info after delete on studentinfo for each row begin insert into timelog(savetime)values(now()); insert into timeinfo(info)values('deleteact'); end // 當(dāng)用戶對(duì)students表執(zhí)行DELETE操作時(shí),students數(shù)據(jù)庫(kù)中的timelog數(shù)據(jù)表和timeinfo數(shù)據(jù)表中分別被插入操作時(shí)間和操作信息。
在MySQL中,一個(gè)表在相同的時(shí)間和相同的觸發(fā)時(shí)間只能創(chuàng)建一個(gè)觸發(fā)器,如觸發(fā)時(shí)間INSERT,觸發(fā)時(shí)間為AFTER的觸發(fā)器只能有一個(gè),但是可以定義BEFORE的觸發(fā)器。
查看觸發(fā)器
在MySQL中,可以執(zhí)行SHOW TRIGGERS語句查看觸發(fā)器的基本信息,其基本形式如下:
SHOW TRIGGERS;
在命令提示符中輸入SHOW TRIGGERS語句即可查看選擇數(shù)據(jù)庫(kù)中的所有觸發(fā)器,但是,應(yīng)用該查看語句存在一定弊端,即只能查詢所有觸發(fā)器的內(nèi)容,并不能指定查看某個(gè)觸發(fā)器的信息。這樣一來,就會(huì)在用戶查找指定觸發(fā)器信息的時(shí)候帶來極大不便。故推薦只在觸發(fā)器數(shù)量較少的情況下應(yīng)用SHOW TRIGGERS語句查詢觸發(fā)器基本信息。
查看triggers表中觸發(fā)器信息
在MySQL中,所有觸發(fā)器的定義都存在該數(shù)據(jù)庫(kù)的triggers表中。讀者可以通過查詢triggers表來查看數(shù)據(jù)庫(kù)中所有觸發(fā)器的詳細(xì)信息。查詢語句如下所示:
SELECT * FROM information_schema.triggers;
其中,information_schema是MySQL中默認(rèn)存在的庫(kù),而information_schema是數(shù)據(jù)庫(kù)中用于記錄觸發(fā)器信息的數(shù)據(jù)表。通過SELECT語句查看觸發(fā)器信息,如果用戶想要查看某個(gè)指定觸發(fā)器的內(nèi)容,可以通過where子句應(yīng)用TRIGGER字段作為查詢條件。代碼如下:
SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='觸發(fā)器名稱';
其中,“觸發(fā)器名稱”這一參數(shù)為用戶指定要查看的觸發(fā)器名稱,和其他SELECT查詢語句相同,該名稱內(nèi)容需要用一對(duì)“''”(單引號(hào))引用指定的文字內(nèi)容。
應(yīng)用觸發(fā)器
在MySQL中,觸發(fā)器按以下順序執(zhí)行:BEFORE觸發(fā)器、表操作、AFTER觸發(fā)器操作。其中,表操作包括常用的數(shù)據(jù)庫(kù)操作命令如INSERT、UPDATE、DELETE。
觸發(fā)器中不能包含START TRANSCATION、COMMIT或ROLLBACK等關(guān)鍵詞,也不能包含CALL語句。觸發(fā)器執(zhí)行非常嚴(yán)密,每一環(huán)都息息相關(guān),任何錯(cuò)誤都可能導(dǎo)致程序無法向下執(zhí)行。由于已經(jīng)更新過的數(shù)據(jù)表是不能回滾的,故在設(shè)計(jì)過程中一定要注意觸發(fā)器的邏輯嚴(yán)密性。
刪除觸發(fā)器
在MySQL中,既然可以創(chuàng)建觸發(fā)器,同樣也可以通過命令刪除觸發(fā)器,即刪除原來已經(jīng)在某個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建的觸發(fā)器,與MySQL中刪除數(shù)據(jù)庫(kù)的命令相似,刪除觸發(fā)器應(yīng)用DROP關(guān)鍵字。其語法格式如下:
DROP TRIGGER 觸發(fā)器名稱
“觸發(fā)器名稱”參數(shù)為用戶指定要?jiǎng)h除的觸發(fā)器名稱,如果指定某個(gè)特定觸發(fā)器名稱,MySQL在執(zhí)行過程中將會(huì)在當(dāng)前庫(kù)中查找觸發(fā)器。