mysql触发器Before和After的区别

转载 2012年03月24日 12:41:05

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 子句通知触发器每隔一行执行一次动作,而不是对整个表,在触发器中我们经常会用到NEWOLD这两个关键字,在这里我还是先解释下这两个字的意思!其中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


mysql关键字AFTER

myql 关键字after表示在某列的后面增加一列。 示例入下 USE database1 ALTER TABLE table1 ADD COLUMN `col_a` text COLLATE ...
  • lsm135
  • lsm135
  • 2017年04月22日 22:07
  • 624

mysql 添加字段、删除字段、调整字段顺序

用过mysql的朋友,可能都在使用phpMyAdmin,我从2003年开始使用,感觉那东西适合远程mysql管理,并不适合单机、单数据库的管理操作,特别是开发使用。给家推荐一个软件管理mysql数据库...
  • changemyself
  • changemyself
  • 2010年10月30日 15:54
  • 28922

mysql 报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executin

昨天登录mysql(Server version: 5.7.11) 还是很好的,今天登录后执行任何命令都报下面的错误 mysql> help contents ERROR 1820 (HY000):...
  • Brighter_Xiao
  • Brighter_Xiao
  • 2016年06月01日 15:43
  • 8985

MySQL存储过程学习笔记

一、基本语法及简单实例 1、创建简单的测试环境 mysql> use test; Database changed mysql> show tables; Empty set (0.00 se...
  • horace20
  • horace20
  • 2011年12月09日 11:07
  • 18387

MySQL触发器 trigger之after与before区分

after:是先完成数据的增删改,然后再触发,触发的语句晚于监视的增删改,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品数量。当商品数量少于订单数量时造成爆库。 before:先完成触...
  • guugle2010
  • guugle2010
  • 2014年10月23日 14:07
  • 2670

触发器里面before和after的区别

关键字before和after用于标识触发时间,顾名思义,before代表触发器里面的命令在DML修改数据之前执行,after代表触发器里面的命令在DML修改数据之后执行。    读者可以结合应用场景...
  • zhangzl1012
  • zhangzl1012
  • 2017年10月09日 22:29
  • 341

【mysql】insert的几种方式

笔者创建的student表,总共三个字段(studentId是主键) 一、往student_info表中插入一条数据 insert into student_info values(5,'...
  • qq_31083947
  • qq_31083947
  • 2017年08月09日 15:48
  • 3226

MySQL在指定列之前或之后插入列 (Add a column to an existing MySQL table)

转自:http://www.tech-recipes.com/rx/378/add-a-column-to-an-existing-mysql-table/ To add a c...
  • qq361301276
  • qq361301276
  • 2013年08月22日 18:15
  • 14365

关于mysql中insert、update、delete的触发器(跨库操作)

 --新增触发器 drop trigger if exists test_zwd; delimiter// create trigger test_zwd after insert on...
  • zhouweido
  • zhouweido
  • 2016年01月19日 14:50
  • 2482

mysql之触发器before和after的区别

mysql之触发器before和after的区别 我们先做个测试: 接上篇日志建的商品表g和订单表o和触发器 假设:假设商品表有商品1,数量是10; 我们往订单表插入一条记录: inse...
  • sustskd
  • sustskd
  • 2014年09月28日 16:28
  • 1213
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql触发器Before和After的区别
举报原因:
原因补充:

(最多只允许输入30个字)