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相當於設置了斷點,我們可以處理刪除外鍵。