Before与After区别:
before:(insert、update)可以对new进行修改,after不能对new进行修改,两者都不能修改old数据。
对于INSERT语句, 只有NEW是合法的;
对于DELETE语句,只有OLD才合法;
对于UPDATE语句,NEW、OLD可以同时使用。
例子如下:
mysql> select * from t1;
+----+-------+
| id | name |
+----+-------+
| 1 | zhang |
+----+-------+
mysql> delimiter //
mysql> create trigger tb before update on t1
-> for each row
-> begin
-> set NEW.id=NEW.id+5;
-> set NEW.name=upper(NEW.name);
-> insert into t2 values(NEW.id,NEW.name);
-> end;//
分隔符换回分号
mysql> delimiter ;
mysql> update t1 set name='huang' where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t1 ;
+----+-------+
| id | name |
+----+-------+
| 6 | HUANG |
+----+-------+
1 row in set (0.00 sec)
mysql> select * from t2;
+----+-------+
| id | name |
+----+-------+
| 6 | HUANG |
+----+-------+
1 row in set (0.00 sec)
由上可知,如果trigger用的是before,则可以修改new的值,并写入到数据库中
同样的代码,把before改成after,则会报错
mysql> delimiter //
mysql> create trigger ta after update on t1
-> for each row
-> begin
-> set NEW.id=NEW.id+5;
-> set NEW.name=upper(NEW.name);
-> insert into t2 values (NEW.id,NEW.name);
-> end;//
ERROR 1362 (HY000): Updating of NEW row is not allowed in after trigger
将after内容改写如下:运行正常
mysql> delimiter //
mysql> create trigger ta after update on t1 for each row
-> begin
-> insert into t2 values (OLD.id,NEW.name);
-> end;//
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
mysql> update t1 set name='chen' where id=6; mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 6 | chen |
+----+------+
1 row in set (0.00 sec) mysql> select * from t2;
+----+-------+
| id | name |
+----+-------+
| 6 | HUANG |
| 6 | chen |
+----+-------+
2 rows in set (0.00 sec)
总结如下:
after—是在记录操纵之后触发,是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作
before—是在记录操纵之前触发,是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作,如:我们在触发之前需要判断new值和old值的大小或关系,如果满足要求就触发,不通过就修改再触发;如:表之间定义的有外键,在删除主键时,必须要先删除外键表,这时就有先后之分,这里before相当于设置了断点,我们可以处理删除外键。