为了账号安全,请及时绑定邮箱和手机立即绑定

触发器before和after的区别

标签:
MySQL


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` 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$$

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

 

©著作权归作者所有:来自51CTO博客作者liang3391的原创作品,如需转载,请注明出处,否则将追究法律责任

mysqlmysql


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消