1.概念:觸發器是mysql響應insert、update、delete語句時自動執行的一條SQL語句。
隻有表支援觸發器,視圖是不支援觸發器的。
2.觸發器需要的資訊:
<1>.唯一的觸發器名稱(一個表中的觸發器名稱唯一,而不是一個資料庫中觸發器名稱唯一!
即兩個表可以有相同名稱的觸發器);
<2>.觸發器關聯的表;
<3>.觸發器應該響應的事件(insert、update、delete);
<4>.觸發器何時執行(處理之前或者處理之後!)
故觸發器分兩種:前置觸發器、後置觸發器。
<5>.一個表的一個事件最後隻有兩個觸發器(處理之前、處理之後),是以一個表最多有6個觸發器。
<6>.如果響應之前的觸發器執行失敗,響應則不會執行。
響應之前的觸發器或響應執行失敗,那麼響應之後的觸發器則不會執行。
4.insert事件的觸發器:
#1.建立兩個測試表
USE mydb;
#表1:t_tableA
CREATE TABLE t_tableA(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
val VARCHAR(20)
);
#表2:t_tableB
CREATE TABLE t_tableB(
#2.建立insert後置觸發器
CREATE TRIGGER tr_insert_tableA /*tr_insert_tableA是觸發器的名稱*/
AFTER INSERT ON t_tableA /*一個後置在t_tableA表上的insert的觸發器*/
FOR EACH ROW /*對所有代碼行都執行*/
INSERT INTO t_tableB(val) VALUES(new.val); /*觸發器的内容,将
a表中插入的資料放到b表中一份,insert觸發器會通路一個名稱為new的虛拟表,擷取剛插入的值*/
/*測試一下上面的insert後置觸發器*/
INSERT INTO t_tableA(val) VALUES('ok');
/*
說明:
①在insert觸發器内,可引用一個名為new的虛拟表,通路被插入的行
②在beforeInsert觸發器中,new中的值也可以被更新(運作更改被插入的值)
③對于自動增長列,new在insert執行之前的值為0,在執行之後是新的自動生成的值
*/
#第二個觸發器:獲得剛剛插入的自動生成的主鍵值 (注意:你應該把上面的一個觸發器删掉再建立這個啊!!)
CREATE TRIGGER t_insert_pk_tableA
AFTER INSERT ON t_tableA
FOR EACH ROW
SELECT new.id INTO @id;
/*測試一下*/
INSERT INTO t_tableA(val) VALUES('no');
SELECT @id;
2.update事件的觸發器:
#①在update觸發器代碼中,可以引用一個名為old的虛拟表通路以前的值,引用一個名為new的表通路新更新的值
#②在beforeupdate觸發器中,new表中的值允許被更新(允許更改要用于update語句中的值);
#③old表的值都是隻讀的,不能更改的。
eg.建立一個觸發器,将a表中修改後的名字都更改為大寫!!
DELIMITER //
CREATE TRIGGER t_update_tableA
BEFORE UPDATE ON t_tableA
FOR EACH ROW
BEGIN
SET new.val = UPPER(new.val); /*so important!!*/
END //
DELIMITER ;
測試一下上面的觸發器:
UPDATE t_tableA SET val='xyz' WHERE id=1;
3.delete事件的觸發器:
①在delete觸發器代碼中,可以引用一個old的虛拟表,通路被删除的行。
②old表中的值全部是隻讀的,不能更新的!!
/*把從a表删除的資料,插入到b表中,可以作為備份用!*/
CREATE TRIGGER t_delete_tableA
AFTER DELETE ON t_tableA
INSERT INTO t_tableB(val) VALUES(old.val);
/*測試一把:*/
DELETE FROM t_tableA WHERE id=1;
4.觸發器的删除:drop trigger tr_insert_tableA;(tr_insert_table是觸發器名)
5.說明性的東西:
<1>.從我上面的三個例子,你可以發現,delimiter //,以及begin,end //不是必須的東西;寫與不寫影響不大。
<2>.由于這玩意在開發用的比較少,我這裡隻說了最基本的應用。以後需要了咱們再接着補充吧!
本文轉自韓立偉 51CTO部落格,原文連結:http://blog.51cto.com/hanchaohan/926550,如需轉載請自行聯系原作者