MySQL 中嵌入的一段程式包括觸發器和預存程序,二者俱有相似之處。觸發器是由事件來觸發某個操作。當資料庫執行這些事件時,就會啟動觸發器來執行對應的操作。 MySQL中,觸發條件包括UPDATE、INSERT和DELETE操作。
在MySQL中,目前只有UPDATE,INSERT,和DELETE這三個動作,才會觸發觸發器,其他操作都不支援觸發器。這和Oracle中的觸發器有很大的差別,要注意區分。
觸發器的每個表每次事件,都只允許一個觸發器。因此,每個表最多值允許有6個觸發器。假如一個表格需要對INSERT和DELETE兩種事件觸發,則需要分別建立兩個觸發器。
只有表格支援觸發器,檢視和暫存表不支援。
CREATE TRIGGER TRIGGER_NAME BEFORE/AFTER UPDATE/INSERT/DELETE ON TABLE_NAME FOR EACH ROW #触发器主体 [BEGIN] SQL操作 [END];
建立觸發器:和建立預存程序是一樣,用的都是CREATE 語句,但要注意,這裡沒有OR REPLACE。
TRIGGER_NAME:觸發器名稱。在MySQL中,要確保每個表中的觸發器是唯一的,每一個資料庫內的觸發器可以不唯一,這就說明了一個資料庫內的兩個表可以有相同的觸發器。這種行為在其他的資料庫內是不被允許的。為了保持格式的一致性,應盡量確保TRIGGER_NAME的獨特性。
BEFORE/AFTER:觸發器被觸發的時刻。如果你想讓觸發器在事件觸發之前執行,可以使用“BEFORE”,如果想在事件觸發之後執行,可以使用“AFTER”。
操作:UPDATE/INSERT/DELETE,會觸發對應的事件和條件。 MySQL只允許這三種DDL操作支援觸發器,其他操作皆不支援。
FOR EACH ROW:受觸發事件影響的每一行都要啟動觸發器的動作。在MySQL中,行觸發是指FOE EACH ROW不能省略,不支援語句觸發。
觸發器主體:既可以是單獨的一條SQL語句,也可以是由BEGIN...END組成的複雜結構塊。
# 创建一个触发器T1,在对表customer做插入操作时,就会触发T1,之后会在日志表note中插入一条数据 CREATE TRIGGER T1 AFTER INSERT ON customer FOR EACH ROW # 触发器主体 INSERT INTO note(日期,目标,操作) VALUES(NOW(),'customer','insert');
和刪除表和預存程序類似,都是使用DROP語句來刪除觸發器。
#删除触发器T1 DROP TRIGGER IF EXISTS T1;
觸發器不能夠更新和修改,想要修改一個觸發器的內容,只能先將觸發器刪除,在建立新的觸發器。
#在已知数据库内,查询触发器 SHOW TRIGGERS; SELECT * FROM information_schema.TRIGGERS WHERE TRIGGER_NAME = '触发器名' #查询所有的触发器 SELECT * FROM information_schema.TRIGGERS(WHERE TRIGGER_SCHEMA = '数据库名')
觸發器在DDL操作之前或之後觸發,總是會對目標表做出一定的改動,有時我們需要知道目標表改變前後的值,這就用到了OLD和NEW的用法。
顧名思義,OLD就是改變之前的值,是UPDATE之前或是要被DELETE或是已經被DELETE的值。
而NEW,則是UPDATE之後的新值,即將INSERT或已經INSERT的值。
具體實例:
#创建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; #向表中插入数据 #创建一个update触发器 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; #触发触发器T2 UPDATE customer SET CUST_ID = '10000' WHERE CUST_NAME = 'AAA'; #查询OLD和NEW SELECT @OLD_ID,@NEW_ID;
以上是Mysql中的觸發器的語法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!