原文地址:https://dwz.cn/yCYkG78b
作者:best.lei
觸發(fā)器和存儲過程一樣,都是嵌入到MySQL的一段程序。不同的是,執(zhí)行存儲過程需要使用CALL語句來調(diào)用,而觸發(fā)器是由事件觸發(fā)某些操作,這些事件包括INSERT、UPDATE、DELETE。一旦定義了觸發(fā)程序,當(dāng)數(shù)據(jù)庫執(zhí)行這些語句時(shí),就會激發(fā)觸發(fā)器執(zhí)行相應(yīng)的操作。本片博客將通過實(shí)例介紹觸發(fā)器的定義、創(chuàng)建、查看以及刪除。
- 創(chuàng)建觸發(fā)器
觸發(fā)器可以查詢其他表,而且可以包含復(fù)雜的SQL語句,用于滿足復(fù)雜的業(yè)務(wù)規(guī)則或要求。但在觸發(fā)器中不能對被觸發(fā)表進(jìn)行操作。如下是觸發(fā)器的創(chuàng)建語法:
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)識觸發(fā)事件,包括INSERT、UPDATE和DELETE;tb_name標(biāo)識在哪張表上建立觸發(fā)器;trigger_statement是觸發(fā)程序體。觸發(fā)程序可以使用BEGIN和END作為開始和結(jié)束,中間包含多條語句。
我們在以往的學(xué)生成績表上創(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ù)庫中已經(jīng)存在的觸發(fā)器的定義、狀態(tài)和語法信息等。本節(jié)將介紹兩種查看觸發(fā)器的方法,分別是SHOW TRIGGERS和在triggers表中查看觸發(fā)器信息。
1.SHOW TRIGGERS語句查看觸發(fā)器信息,語法格式為:SHOW TRIGGERSG;

2..當(dāng)觸發(fā)器較少時(shí),可以通過SHOW TRIGGERS查看。如果觸發(fā)器很多,且需要查看特定觸發(fā)器的信息,則通過在information_schema數(shù)據(jù)庫中的triggers表中查找更方便。具體語法格式如下:
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ù)庫;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語句刪除MySQL中已經(jīng)存在的觸發(fā)器,基本語句格式為:DROP TRIGGER [schema_name.]trigger_name;
如想刪除創(chuàng)建的p_in觸發(fā)器,只需執(zhí)行:DROP TRIGGER test.p_in;

- 注意事項(xiàng)
在使用觸發(fā)器時(shí),對于一張表的相同事件只能創(chuàng)建一個(gè)觸發(fā)器。如對表tb_score的BEFORE INSERT事件只能創(chuàng)建一個(gè)觸發(fā)器。及時(shí)刪除不需要的觸發(fā)器。