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 触发器Before 和After 的区别
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 触发器的实际式操作中的代码,以下就是⽂章的详细内容介绍,望⼤家借鉴。原⽂地址:
FOR EACH ROW ⼦句通知触发器每隔⼀⾏执⾏⼀次动作,⽽不是对整个表,在触发器中我们经常会⽤到NEW 和OLD 这两个关键字,在这⾥我还是先解释下这两个字的意思!其中NEW 是指刚刚插⼊到数据库的数据表中的⼀个域,也可以理解为对象(object )的意思。⽐如在⼀个insert 触发器中我⽤到了NEW 那他的意思就是说,要使⽤刚刚插⼊到数据表的某个值,要使⽤具体的某⼀个值的话需要这样⼦写:NEW.字段名(NEW.username )这样⼦就获取到了刚刚插⼊到数据表中的⼀个字段的值!!OLD ,OLD 是在delete 触发器中有⽤的,意思是说我要删除⼀条数据,但是在触发器中要⽤到之前的那个数据,那么我就可以通过OLD 来获取了!⽐如我删除了⼀条数据,⾥⾯包含⼀个email ,现在我在触发器的内部sql 中要⽤就可以这样⼦写:ail!
对于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 触发器代码:
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` AFTER 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$$
把before触发器删除,在重新建⽴触发器的时候会报错,报错信息如下:
由于是after触发器,不能对NEW值修改,所以报错。
所以,after触发器就改成了如下:
DELIMITER
USE‘test‘
DROP TRIGGER /*!50032 IF EXISTS */ `t1_after`
CREATE/∗!50017DEFINER=′admin′@′TRIGGER‘t1after‘AFTERUPDATEON‘t1‘FOREACHROWBEGIN−−setNEW.id=NEW.id+11;−−setNEW.name=UPPER(NEW.name);INSERTINTOt2V 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;
+----+------+
drop table if exists admin| 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)
参考:
topic.csdn/u/20090531/13/faf9fbb4-2a16-4da8-a54b-e1cd2cf55548.html
blog.xhbin/archives/155
farmeryxb.iteye/blog/332643