1. 程式人生 > 資料庫 >初識MySQL(8)使用觸發器

初識MySQL(8)使用觸發器

1.觸發器的作用

當一個SQL語句被執行之後,我們可能會需要一些事情自動發生:
(1)每當增加一個顧客到資料庫表的時候,都檢查其電話號碼格式是否正確;
(2)每當訂購一個產品時,都從庫存數量中減去訂購的數量;
(3)無論何時刪除一行,都在某個存檔表中保留一個副本。

所有例子的共同之處是他們都需要在某個表發生變動的時候自動處理一些事情,這就是觸發器。
觸發器支援DELETE,INSERT,UPDATE語句,其他語句不支援觸發器。

2.建立觸發器

在我們建立一個觸發器的時候,我們需要給出一下4個資訊:
(1)唯一的觸發器名
(2)觸發器關聯的表
(3)觸發器應該響應的活動(DELETE,UPDATE,INSERT)

(4)觸發器何時執行(處理前或處理後)

建立觸發器的一個例子:

CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added';

以上建立觸發器的例子,表明了這是一個針對表products的觸發器,並且響應的活動是INSERT操作,並在操作處理之後啟動觸發器,而FOR EACH ROW SELECT 'Product added’指的就是在每一行的插入操作之後文字’Product added’均會被顯示。
注意,只有表支援觸發器,檢視並不支援觸發器!

3.刪除觸發器

DROP TRIGGER newproduct;

4.使用觸發器

INSER觸發器:
在使用INSERT觸發器的時候,我們引入一個新的概念,就是一個名為NEW的虛擬表,來表示插入完成之後的新表,然後用NEW來訪問被插入的行。
NEW表中的值可以被更新。

CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num;

此程式碼建立了一個名為neworder的觸發器,他按照AFTER INSERT在order表上執行。在插入了一個新的行之後,生成一個新的訂單號並儲存到order_num中。觸發器從NEW.order_num取得這個值並返回他。

DELETE觸發器


在使用DELETE觸發器的時候,相對應的也有一個OLD的虛擬表,來表示刪除之前的舊錶,然後用OLD來訪問被刪除的行。
OLD表中的值是隻讀的,不可以被更新。

CREATE TRIGGER deleteorder BEFORE DELETE ON orders FOR EACH ROW
BEGIN
	INSERT INTO archive_orders(order_num,order_date,cust_id)
	VALUES(OLD.order_num,OLD.order_date,OLD.cust_id);
END;

此語句的作用是在任意刪除語句觸發前,使用一個INSERT語句將刪除的那一行儲存在一個名為archive_orders的表中。
上面例子使用了BEGIN/END結構,用於在觸發器有多條SQL語句時容納,使得程式碼整體的結構比較清晰明確,不過在上述例子中其實並不是必要的。

UPDATE觸發器
同理,UPDATE可以對操作前和操作後的表都進行操作,因此NEW和OLD都可以在UPDATE觸發器中使用。使用道理與上面的兩種情況相同。

CREATE TRIGGER updateevendor BEFORE UPDATE ON vendors
FOR EACH ROW SET NEW.vend_state = Upper(NEW.vend_state);

以上語句實現的功能就是在每一次進行更新的行的vend_state值都轉化為大寫的值。