1、 觸發器定義:
觸發器(trigger)是SQL server 提供給程式員和資料分析員來保證資料完整性的一種方法,它是與表事件相關的特殊的存盤程序,它的執行不是由程式呼叫,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行,觸發器經常用于加強資料的完整性約束和業務規則等, ——百度百科
2、 創建觸發器的四個要素:
(1) 監視地點(table)
(2) 監視事件(insert|update|delete)
(3) 觸發時間(before|after)
(4) 觸發事件(insert|update|delete)
備注:保持每個資料庫的觸發器名唯一,
3、 創建觸發器
simple example:
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added';
分析:CREATE TRIGGER用來創建名為newproduct的觸發器,觸發器可在一個操作發生之前或之后執行,這里給出了AFTER INSERT,所以此觸發器將在INSERT陳述句成功后執行,FOR EACH ROW(代碼對每個插入行執行),在這個例子中,文本Product added將對每個插入的行顯示一次,
4、查看和洗掉已有的觸發器
-
查看已有觸發器:
SHOW TRIGGERS; -
洗掉已有觸發器:
DROP TRIGGER trigger_name;
5、使用觸發器
5.1 INSERT觸發器
-
在INSERT觸發器代碼內,可參考一個名為NEW的虛擬表,訪問被插入的行;
-
在BEFORE INSERT觸發器中,NEW中的值也可以被更新(允許更改被插入的值);
-
對于AUTO_INCREMENT列,NEW在INSERT執行之前包含0,在INSERT執行之后包含新的自動生成值,
example:
CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num INTO @num;
分析:在插入一個新訂單到orders表時,MySQL生成一個新訂單號并保存到order_num中,觸發器從NEW.order_num取得這個值并回傳它,對于orders的每次插入使用這個觸發器將總是回傳新的訂單號,
測驗:
INSERT INTO orders(order_date,cust_id) VALUES(Now(),10001);

注:從MySQL5以后不支持觸發器回傳結果集
5.2 DELETE觸發器
-
在DELETE觸發器代碼內,可參考一個名為OLD的虛擬表,訪問被洗掉的行;
-
OLD的值全都是只讀的,不能更新,
example(使用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陳述句將OLD中的值(要被洗掉的訂單)保存到一個名為archive_orders的存檔中(為實際使用這個例子,你需要用與orders表相同的列創建一個archive_orders的表),
5.3 UPDATE觸發器
-
在DELETE觸發器代碼中,可參考一個名為OLD的虛擬表訪問以前(UPDATE陳述句前)的值,參考一個名為NEW的虛擬表訪問新更新的值;
-
在BEFORE DELETE觸發器中,NEW中的值可能也被更新(允許更改將要用于UPDATE陳述句中的值);
-
OLD的值全都是只讀的,不能更新,
example(保證州名縮寫總是大寫,不管UPDATE陳述句中給出的事大寫還是小寫):
CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors FOR EACH ROW SET NEW.vend_state = Upper(NEW.vend_state);
分析:顯然,任何資料凈化都需要在UPDATE陳述句之前進行,每次更新一行是,NEW,vend_state中的值(將來用來更新行的值)都用Upper(NEW.vend_state)替換,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/227439.html
標籤:其他
