首頁 > 軟體

Mysql中的觸發器定義及語法介紹

2022-06-23 14:00:51

1.定義:

  觸發器和儲存過程相似,都是嵌入到 MySQL 中的一段程式。觸發器是由事件來觸發某個操作。當資料庫執行這些事件時,就會啟用觸發器來執行相應的操作。這些事件稱為觸發條件,在MySQL中,有UPDATE,INSERT,和DELETE。

  • 在MySQL中,目前只有UPDATE,INSERT,和DELETE這三種操作,才會觸發觸發器,其他操作都不支援觸發器。這和Oracle中的觸發器有很大的區別,要注意區分。
  • 觸發器的每個表每次事件,都只允許一個觸發器。因此,每個表最多值允許有6個觸發器。如果一個表有兩個事件,INSERT和DELETE,那麼就要分別建立一個觸發器。
  • 只有表才支援觸發器,檢視和臨時表不支援。

2.語法:

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');

3.刪除觸發器

  和刪除表和儲存過程類似,都是使用DROP語句來刪除觸發器。

#刪除觸發器T1
DROP TRIGGER IF EXISTS T1;

觸發器不能夠更新和修改,想要修改一個觸發器的內容,只能先將觸發器刪除,在建立一個新的觸發器。

4.查詢觸發器

#在已知資料庫內,查詢觸發器
SHOW TRIGGERS;
SELECT * FROM information_schema.TRIGGERS WHERE TRIGGER_NAME = '觸發器名'
#查詢所有的觸發器
SELECT * FROM information_schema.TRIGGERS(WHERE TRIGGER_SCHEMA = '資料庫名')

5.觸發器型別OLD和NEW的使用

  觸發器在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中的觸發器的文章就介紹到這了,更多相關mysql觸發器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com