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

 1.概念:觸發器是mysql響應insert、update、delete語句時自動執行的一條SQL語句。mysql

  ★只有表支持觸發器,視圖是不支持觸發器的。★
 
2.觸發器須要的信息:
<1>.惟一的觸發器名稱( ★一個表中的觸發器名稱惟一,而不是一個數據庫中觸發器名稱惟一!
★即兩個表能夠有相同名稱的觸發器);  
 
<2>.觸發器關聯的表;
 
<3>.觸發器應該響應的事件(insert、update、delete);
 
<4>.觸發器什麼時候執行(處理以前或者處理以後!) 
    ★故觸發器分兩種 :前置觸發器後置觸發器
    
<5>.一個表的一個事件最後只有兩個觸發器(處理以前、處理以後),因此 一個表最多有6個觸發器。★
 
<6>. ☆若是響應以前的觸發器執行失敗,響應則不會執行。
      響應以前的觸發器或響應執行失敗,那麼響應以後的觸發器則不會執行。
 
 
4.insert事件的觸發器:
 
 
  
  
  
  
  1. #1.建立兩個測試表  
  2. USE mydb;  
  3.   
  4. #表1:t_tableA  
  5. CREATE TABLE t_tableA(  
  6. id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,  
  7. val VARCHAR(20)  
  8. );  
  9.   
  10. #表2:t_tableB  
  11. CREATE TABLE t_tableB(  
  12. id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,  
  13. val VARCHAR(20)  
  14. );  
  15.   
  16.   
  17. #2.建立insert後置觸發器  
  18. CREATE TRIGGER tr_insert_tableA   /*tr_insert_tableA是觸發器的名稱*/  
  19. AFTER INSERT ON t_tableA   /*一個後置在t_tableA表上的insert的觸發器*/  
  20. FOR EACH ROW  /*對全部代碼行都執行*/  
  21. INSERT INTO t_tableB(val) VALUES(new.val);  /*觸發器的內容,將  
  22. a表中插入的數據放到b表中一份,insert觸發器會訪問一個名稱爲new的虛擬表,獲取剛插入的值*/  
  23.   
  24. /*測試一下上面的insert後置觸發器*/  
  25. INSERT INTO t_tableA(val) VALUES('ok');  
  26.   
  27. /*  
  28. 說明:  
  29. ①在insert觸發器內,可引用一個名爲new的虛擬表,訪問被插入的行  
  30. ②在beforeInsert觸發器中,new中的值也能夠被更新(運行更改被插入的值)  
  31. ③對於自動增加列,new在insert執行以前的值爲0,在執行以後是新的自動生成的值  
  32. */  
  33.   
  34. #第二個觸發器:得到剛剛插入的自動生成的主鍵值  (注意:你應該把上面的一個觸發器刪掉再建立這個啊!!)  
  35. CREATE TRIGGER t_insert_pk_tableA  
  36. AFTER INSERT ON t_tableA  
  37. FOR EACH ROW  
  38. SELECT new.id INTO @id;  
  39.   
  40. /*測試一下*/  
  41. INSERT INTO t_tableA(val) VALUES('no');  
  42. SELECT @id;     
2.update事件的觸發器:
#①在update觸發器代碼中,能夠引用一個名爲old的虛擬訪問之前的值,引用一個名爲new的表訪問新更新的值
#②在beforeupdate觸發器中,new表中的值容許被更新(容許更改要用於update語句中的值);
#③old表的值都是隻讀的,不能更改的。
 
 
  
  
  
  
  1. eg.建立一個觸發器,將a表中修改後的名字都更改成大寫!! 
  2.  
  3. DELIMITER // 
  4. CREATE TRIGGER t_update_tableA 
  5. BEFORE UPDATE ON t_tableA 
  6. FOR EACH ROW 
  7. BEGIN 
  8. SET new.val = UPPER(new.val);  /*so important!!*/ 
  9. END // 
  10. DELIMITER ; 
  11.  
  12. 測試一下上面的觸發器: 
  13. UPDATE t_tableA SET val='xyz' WHERE id=1; 
 
3.delete事件的觸發器:
 
①在delete觸發器代碼中,能夠引用一個old的虛擬表,訪問被刪除的行。
 
②old表中的值所有是隻讀的,不能更新的!!
 
 
  
  
  
  
  1. /*把從a表刪除的數據,插入到b表中,能夠做爲備份用!*/ 
  2.  
  3. DELIMITER // 
  4. CREATE TRIGGER t_delete_tableA 
  5. AFTER DELETE ON t_tableA  
  6. FOR EACH ROW  
  7. BEGIN 
  8. INSERT INTO t_tableB(val) VALUES(old.val); 
  9. END // 
  10. DELIMITER ; 
  11.  
  12. /*測試一把:*/ 
  13. DELETE FROM t_tableA WHERE id=1
 
4.觸發器的刪除drop trigger tr_insert_tableA;(tr_insert_table是觸發器名)
 
 
5.說明性的東西:
<1>.從我上面的三個例子,你能夠發現,delimiter //,以及begin,end //不是必須的東西;寫與不寫影響不大。
 
<2>.因爲這玩意在開發用的比較少,我這裏只說了最基本的應用。之後須要了我們再接着補充吧!
相關文章
相關標籤/搜索