Before与After区别:before:
(insert、update)可以对new进行修
改。
after不能对new进行修
改。
两者都不能修改old数
据。
触发器,顾名思义,就是当执行某
个事件的时候触发另一个事件的执
行!这个触发的时间分为BEFORE
和AFTER两种,分别有 before
insert,before update,before
delete和after insert,after
update,after delete 这六种情况
以下的文章主要向大家讲述的是
MySQL触发器的实际使用详细说明
与实际案例分析,同时本文也列举
了一些在MySQL触发器的实际式操
作中的代码,以下就是文章的详细
内容介绍,望大家借鉴。原文地
址: http://database.51cto.com/
art/201005/200671.htm
FOR EACH ROW 子句通知触发器
每隔一行执行一次动作,而不是对
整个表,在触发器中我们经常会用
到NEW 和OLD 这两个关键字,在这
里我还是先解释下这两个字的意
思!其中 NEW 是指刚刚插入到数据
库的数据表中的一个域,也可以理
解为对象(object)的意思。比如
在一个insert触发器中我用到了
NEW那他的意思就是说,要使用刚
刚插入到数据表的某个值,要使用
具体的某一个值的话需要这样子
写:NEW.字段名
(NEW.username )这样子就获取
到了刚刚插入到数据表中的一个字
段的值!! OLD ,OLD是在delete
触发器中有用的,意思是说我要删
除一条数据,但是在触发器中要用
到之前的那个数据,那么我就可以
通过OLD来获取了!比如我删除了
一条数据,里面包含一个email,
现在我在触发器的内部sql中要用就
可以这样子写: OLD.email !
对于INSERT语句, 只有NEW是合法
的;对于DELETE语句,只有OLD才
合法;而UPDATE语句可以在
和NEW以及OLD同时使用 。
下面举例说明:
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
+----+------+
1 row in set (0.00 sec)
mysql> select * from t2;
Empty set (0.00 sec)
before触发器代码:
DELIMITER $$
USE `test`$$
DROP TRIGGER /*!50032 IF
EXISTS */ `t1_before`$$
CREATE
/*!50017 DEFINER =
'admin'@'%' */
TRIGGER `t1_before` BEFORE
UPDATE ON `t1`
FOR EACH ROW
BEGIN
set NEW.id=NEW.id+11;
set NEW.name=UPPER
(NEW.name);
INSERT INTO t2 VALUES
(NEW.id,NEW.name);
END$$
DELIMITER ;
mysql> update t1 set name='bbs'
where id=1;
Query OK, 1 row affected (0.00
sec)
Rows matched: 1 Changed: 1
Warnings: 0
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 12 | BBS |
+----+------+
1 row in set (0.00 sec)
mysql> select * from t2;
+----+------+
| id | name |
+----+------+
| 12 | BBS |
+----+------+
1 row in set (0.00 sec)
NEW值,已经被修改。
===========================
===========================
==================
after触发器代码:
DELIMITER $$
USE `test`$$
DROP TRIGGER /*!50032 IF
EXISTS */ `t1_after`$$
CREATE
/*!50017 DEFINER =
'admin'@'%' */
TRIGGER `t1_after`
AFTERUPDATE ON `t1`
FOR EACH ROW
BEGIN
set NEW.id=NEW.id+11;
set NEW.name=UPPER
(NEW.name);
INSERT INTO t2 VALUES
(NEW.id,NEW.name);
END$$
DELIMITER ;
把before触发器删除,在重新建立
触发器的时候会报错,报错信息如
下:
由于是after触发器,不能对NEW值
修改,所以报错。
所以,after触发器就改成了如下:
DELIMITER $$
USE `test`$$
DROP TRIGGER /*!50032 IF
EXISTS */ `t1_after`$$
CREATE
/*!50017 DEFINER =
'admin'@'%' */
TRIGGER `t1_after` AFTER
UPDATE ON `t1`
FOR EACH ROW
BEGIN
-- set NEW.id=NEW.id+11;
-- set NEW.name=UPPER
(NEW.name);
INSERT INTO t2 VALUES
(OLD.id,OLD.name);
END$$
DELIMITER ;
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
+----+------+
1 row in set (0.00 sec)
mysql> select * from t2;
Empty set (0.00 sec)
mysql> update t1 set name='bbs'
where id=1;
Query OK, 1 row affected (0.00
sec)
Rows matched: 1 Changed: 1
Warnings: 0
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | bbs |
+----+------+
1 row in set (0.00 sec)
mysql> select * from t2;
+----+------+
| id | name |
+----+------+
| 1 | aa |
+----+------+
1 row in set (0.00 sec)
参考:
http://topic.csdn.net/
u/20090531/13/
faf9fbb4-2a16-4da8-a54b-
e1cd2cf55548.html
http://blog.xhbin.com/
archives/155
http://farmeryxb.iteye.com/
blog/332643