天天看點

mysql總結9-------------觸發器的學習

 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,如需轉載請自行聯系原作者