數據庫中觸發器before與after認識


Before與After區別:

before:(insert、update)可以對new進行修改,after不能對new進行修改,兩者都不能修改old數據。

 

對於INSERT語句, 只有NEW是合法的;

對於DELETE語句,只有OLD才合法;

對於UPDATE語句,NEW、OLD可以同時使用。

 

例子如下:

1 mysql> select * from t1; 
2 +----+-------+
3 | id | name |
4 +----+-------+
5 | 1 | zhang |
6 +----+-------+

 

1 mysql> delimiter //
2 mysql> create trigger tb before update on t1 
3     -> for each row
4     -> begin
5     -> set NEW.id=NEW.id+5;
6     -> set NEW.name=upper(NEW.name);
7     -> insert into t2 values(NEW.id,NEW.name);
8     -> end;//

 

1 分隔符換回分號
2 mysql> delimiter ;

 

 1 mysql> update t1 set name='huang' where id=1;
 2 Query OK, 1 row affected (0.01 sec)
 3 Rows matched: 1  Changed: 1  Warnings: 0
 4 
 5 mysql> select * from t1 ;                    
 6 +----+-------+
 7 | id | name  |
 8 +----+-------+
 9 |  6 | HUANG |
10 +----+-------+
11 1 row in set (0.00 sec)
1 mysql> select * from t2;
2 +----+-------+
3 | id | name  |
4 +----+-------+
5 |  6 | HUANG |
6 +----+-------+
7 1 row in set (0.00 sec)

 

由上可知,如果trigger用的是before,則可以修改new的值,並寫入到數據庫中

 

 1 同樣的代碼,把before改成after,則會報錯
 2 mysql> delimiter //
 3 mysql> create trigger ta after update on t1  
 4     -> for each row
 5     -> begin
 6     -> set NEW.id=NEW.id+5;
 7     -> set NEW.name=upper(NEW.name);
 8     -> insert into t2 values (NEW.id,NEW.name);
 9     -> end;//
10 ERROR 1362 (HY000): Updating of NEW row is not allowed in after trigger

 

將after內容改寫如下:運行正常

 1 mysql> delimiter //
 2 mysql> create trigger ta after update on t1 for each row
 3     -> begin
 4     -> insert into t2 values (OLD.id,NEW.name);
 5     -> end;//
 6 Query OK, 0 rows affected (0.00 sec)
 7 
 8 mysql> delimiter ;
 9 mysql> update t1 set name='chen' where id=6;
10 
11 mysql> select * from t1;
12 +----+------+
13 | id | name |
14 +----+------+
15 |  6 | chen |
16 +----+------+
17 1 row in set (0.00 sec)
18 
19 mysql> select * from t2;
20 +----+-------+
21 | id | name  |
22 +----+-------+
23 |  6 | HUANG |
24 |  6 | chen  |
25 +----+-------+
26 2 rows in set (0.00 sec)

 

 總結如下:

after—是在記錄操縱之后觸發,是先完成數據的增刪改,再觸發,觸發的語句晚於監視的增刪改操作,無法影響前面的增刪改動作
before—是在記錄操縱之前觸發,是先完成觸發,再增刪改,觸發的語句先於監視的增刪改,我們就有機會判斷,修改即將發生的操作,如:我們在觸發之前需要判斷new值和old值的大小或關系,如果滿足要求就觸發,不通過就修改再觸發;如:表之間定義的有外鍵,在刪除主鍵時,必須要先刪除外鍵表,這時就有先后之分,這里before相當於設置了斷點,我們可以處理刪除外鍵。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM