Mysql中的觸發(fā)器定義及語法介紹
1.定義:
觸發(fā)器和存儲過程相似,都是嵌入到 MySQL 中的一段程序。觸發(fā)器是由事件來觸發(fā)某個操作。當(dāng)數(shù)據(jù)庫執(zhí)行這些事件時,就會激活觸發(fā)器來執(zhí)行相應(yīng)的操作。這些事件稱為觸發(fā)條件,在MySQL中,有UPDATE,INSERT,和DELETE。
- 在MySQL中,目前只有UPDATE,INSERT,和DELETE這三種操作,才會觸發(fā)觸發(fā)器,其他操作都不支持觸發(fā)器。這和Oracle中的觸發(fā)器有很大的區(qū)別,要注意區(qū)分。
- 觸發(fā)器的每個表每次事件,都只允許一個觸發(fā)器。因此,每個表最多值允許有6個觸發(fā)器。如果一個表有兩個事件,INSERT和DELETE,那么就要分別創(chuàng)建一個觸發(fā)器。
- 只有表才支持觸發(fā)器,視圖和臨時表不支持。
2.語法:
CREATE TRIGGER TRIGGER_NAME BEFORE/AFTER UPDATE/INSERT/DELETE ON TABLE_NAME FOR EACH ROW #觸發(fā)器主體 [BEGIN] SQL操作 [END];
- 創(chuàng)建觸發(fā)器:和創(chuàng)建存儲過程是一樣,用的都是CREATE 語句,但要注意,這里沒有 OR REPLACE。
- TRIGGER_NAME:觸發(fā)器名稱。在MySQL中,要保證每個表中的觸發(fā)器是唯一的,每一個數(shù)據(jù)庫內(nèi)的觸發(fā)器可以不唯一,這就說明了一個數(shù)據(jù)庫內(nèi)的兩個表可以有相同的觸發(fā)器。這種行為在其他的數(shù)據(jù)庫內(nèi)是不被允許的。但是為了格式上的規(guī)范,還是要盡可能的保證TRIGGER_NAME的唯一性。
- BEFORE/AFTER:觸發(fā)器被觸發(fā)的時刻。你如果希望觸發(fā)器在觸發(fā)事件之前發(fā)生,就使用BEFORE,如果希望在觸發(fā)事件之后發(fā)生,就使用AFTER。
- UPDATE/INSERT/DELETE:觸發(fā)事件,觸發(fā)條件。在MySQL中,只有這三種DDL操作支持觸發(fā)器,其他操作都不被允許。
- FOR EACH ROW:受觸發(fā)事件影響的每一行都要激活觸發(fā)器的動作。這里指的是行級觸發(fā),在MySQL里,F(xiàn)OE EACH ROW不可省略,不支持語句級觸發(fā)。
- 觸發(fā)器主體:既可以是單獨的一條SQL語句,也可以是由BEGIN...END組成的復(fù)雜結(jié)構(gòu)塊。
# 創(chuàng)建一個觸發(fā)器T1,在對表customer做插入操作時,就會觸發(fā)T1,之后會在日志表note中插入一條數(shù)據(jù) CREATE TRIGGER T1 AFTER INSERT ON customer FOR EACH ROW # 觸發(fā)器主體 INSERT INTO note(日期,目標(biāo),操作) VALUES(NOW(),'customer','insert');
3.刪除觸發(fā)器
和刪除表和存儲過程類似,都是使用DROP語句來刪除觸發(fā)器。
#刪除觸發(fā)器T1 DROP TRIGGER IF EXISTS T1;
觸發(fā)器不能夠更新和修改,想要修改一個觸發(fā)器的內(nèi)容,只能先將觸發(fā)器刪除,在創(chuàng)建一個新的觸發(fā)器。
4.查詢觸發(fā)器
#在已知數(shù)據(jù)庫內(nèi),查詢觸發(fā)器 SHOW TRIGGERS; SELECT * FROM information_schema.TRIGGERS WHERE TRIGGER_NAME = '觸發(fā)器名' #查詢所有的觸發(fā)器 SELECT * FROM information_schema.TRIGGERS(WHERE TRIGGER_SCHEMA = '數(shù)據(jù)庫名')
5.觸發(fā)器類型OLD和NEW的使用
觸發(fā)器在DDL操作之前或者之后觸發(fā),總會對目標(biāo)表做出一定的改動,有時我們需要知道目標(biāo)表改變前后的值,這就用到了OLD和NEW的用法。
顧名思義,OLD就是改變之前的值,是UPDATE之前或者是要被DELETE或者已經(jīng)被DELETE的值。
而NEW,則是UPDATE之后的新值,即將INSERT或者已經(jīng)INSERT的值。

具體實例:
#創(chuàng)建customer表 CREATE TABLE `customer` (`CUST_ID` int(11) NOT NULL AUTO_INCREMENT, `CUST_NAME` varchar(10) NOT NULL, `CUST_TEL` varchar(10) DEFAULT NULL, PRIMARY KEY (`CUST_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; #向表中插入數(shù)據(jù) #創(chuàng)建一個update觸發(fā)器 CREATE TRIGGER T2 AFTER UPDATE ON customer FOR EACH ROW #old和new的使用方法:old.columnname/new.columnname(列名) #將更新前后的值,賦值給兩個變量 SELECT OLD.CUST_ID,NEW.CUST_ID INTO @OLD_ID,@NEW_ID; #觸發(fā)觸發(fā)器T2 UPDATE customer SET CUST_ID = '10000' WHERE CUST_NAME = 'AAA'; #查詢OLD和NEW SELECT @OLD_ID,@NEW_ID;
到此這篇關(guān)于Mysql中的觸發(fā)器的文章就介紹到這了,更多相關(guān)mysql觸發(fā)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決 phpmyadmin #2002 無法登錄 MySQL 服務(wù)器
我以前使用phpmyadmin都是很正常的,從來沒有出現(xiàn)過問題。但是今天出現(xiàn)了提示#2002無法登陸到MYSQL服務(wù)器2012-04-04
淺談MySQL 億級數(shù)據(jù)分頁的優(yōu)化
mysql大數(shù)據(jù)量使用limit分頁,隨著頁碼的增大,查詢效率越低下。本文就來介紹一下MySQL 億級數(shù)據(jù)分頁的優(yōu)化,感興趣的小伙伴們可以參考一下2021-06-06
MYSQL關(guān)聯(lián)關(guān)系查詢方式
文章詳細(xì)介紹了MySQL中如何使用內(nèi)連接和左外連接進行表的關(guān)聯(lián)查詢,并展示了如何選擇列和使用別名,文章還提供了一些關(guān)于查詢優(yōu)化的建議,并鼓勵讀者參考和支持腳本之家2025-02-02
Mysql從5.6.14安全升級至mysql5.6.25的方法
這篇文章主要介紹了Mysql從5.6.14安全升級至mysql5.6.25的方法,本教程講的非常詳細(xì),具有參考借鑒價值,需要的朋友參考下吧2016-08-08
解決ERROR?1129?(HY000):?Host?‘xxx‘?is?blocked?because?
這篇文章主要介紹了解決ERROR?1129?(HY000):?Host?‘xxx‘?is?blocked?because?of?many問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
Mysql存儲過程學(xué)習(xí)筆記--建立簡單的存儲過程
我們常用的操作數(shù)據(jù)庫語言SQL語句在執(zhí)行的時候需要要先編譯,然后執(zhí)行,而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中,用戶通過指定存儲過程的名字并給定參數(shù)(如果該存儲過程帶有參數(shù))來調(diào)用執(zhí)行它。2014-08-08

