原文地址:https://dwz.cn/yCYkG78b
作者:best.lei
觸發(fā)器和存儲(chǔ)過程一樣,都是嵌入到MySQL的一段程序。不同的是,執(zhí)行存儲(chǔ)過程需要使用CALL語(yǔ)句來(lái)調(diào)用,而觸發(fā)器是由事件觸發(fā)某些操作,這些事件包括INSERT、UPDATE、DELETE。一旦定義了觸發(fā)程序,當(dāng)數(shù)據(jù)庫(kù)執(zhí)行這些語(yǔ)句時(shí),就會(huì)激發(fā)觸發(fā)器執(zhí)行相應(yīng)的操作。本片博客將通過實(shí)例介紹觸發(fā)器的定義、創(chuàng)建、查看以及刪除。
- 創(chuàng)建觸發(fā)器
觸發(fā)器可以查詢其他表,而且可以包含復(fù)雜的SQL語(yǔ)句,用于滿足復(fù)雜的業(yè)務(wù)規(guī)則或要求。但在觸發(fā)器中不能對(duì)被觸發(fā)表進(jìn)行操作。如下是觸發(fā)器的創(chuàng)建語(yǔ)法:
CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_statement
其中trigger_name表示觸發(fā)器名稱;trigger_time表示觸發(fā)器時(shí)機(jī),可以指定為BEFORE或AFTER;trigger_event標(biāo)識(shí)觸發(fā)事件,包括INSERT、UPDATE和DELETE;tb_name標(biāo)識(shí)在哪張表上建立觸發(fā)器;trigger_statement是觸發(fā)程序體。觸發(fā)程序可以使用BEGIN和END作為開始和結(jié)束,中間包含多條語(yǔ)句。
我們?cè)谝酝膶W(xué)生成績(jī)表上創(chuàng)建一個(gè)觸發(fā)器,該觸發(fā)器記錄最新插入的數(shù)據(jù)信息,代碼執(zhí)行如下:
創(chuàng)建觸發(fā)器:CREATE TRIGGER p_in AFTER INSERT ON tb_score
FOR EACH ROW BEGIN
SET @info=CONCAT('studentID=', NEW.sID, ', classID=', NEW.cID, ', grade=', NEW.grade);
END //
向tb_score表中插入值:INSERT INTO tb_score VALUE(3,1,88);
查看變量@info的值:SELECT @info;
- 查看觸發(fā)器
查看觸發(fā)器是指查看數(shù)據(jù)庫(kù)中已經(jīng)存在的觸發(fā)器的定義、狀態(tài)和語(yǔ)法信息等。本節(jié)將介紹兩種查看觸發(fā)器的方法,分別是SHOW TRIGGERS和在triggers表中查看觸發(fā)器信息。
1.SHOW TRIGGERS語(yǔ)句查看觸發(fā)器信息,語(yǔ)法格式為:SHOW TRIGGERSG;
2..當(dāng)觸發(fā)器較少時(shí),可以通過SHOW TRIGGERS查看。如果觸發(fā)器很多,且需要查看特定觸發(fā)器的信息,則通過在information_schema數(shù)據(jù)庫(kù)中的triggers表中查找更方便。具體語(yǔ)法格式如下:
SELECT * FROM information_schema.trigger WHERE condition; 不指定condition則默認(rèn)查詢所有的觸發(fā)器。 如查看指定名稱的觸發(fā)器的詳細(xì)信息:SELECT * FROM information_schema.triggers WHERE trigger_name='p_in'G;
如上執(zhí)行結(jié)果顯示:TRIGGER_SCHEMA表示觸發(fā)器所在的數(shù)據(jù)庫(kù);TRIGGER_NAME表示觸發(fā)器的名稱;EVENT_OBJECT_TABLE表示在哪個(gè)數(shù)據(jù)表上觸發(fā);ACTION_STATEMENT表示觸發(fā)器觸發(fā)時(shí)執(zhí)行的具體操作;ACTION_ORIENTATION表示在每條記錄上都觸發(fā);ACTION_TIMING表示觸發(fā)的時(shí)刻是AFTER。
- 刪除觸發(fā)器
使用DROP TRIGGER語(yǔ)句刪除MySQL中已經(jīng)存在的觸發(fā)器,基本語(yǔ)句格式為:DROP TRIGGER [schema_name.]trigger_name;
如想刪除創(chuàng)建的p_in觸發(fā)器,只需執(zhí)行:DROP TRIGGER test.p_in;
- 注意事項(xiàng)
在使用觸發(fā)器時(shí),對(duì)于一張表的相同事件只能創(chuàng)建一個(gè)觸發(fā)器。如對(duì)表tb_score的BEFORE INSERT事件只能創(chuàng)建一個(gè)觸發(fā)器。及時(shí)刪除不需要的觸發(fā)器。






