MySQL触发器before和after的区别

技术文档 - JS文档 作者: xcheng1986 发布于:2014-06-09 阅读(1636) (暂无评论)  

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   |
	mysql> select * from t2;
	Empty set (0.00 sec)
before触发器代码:
	DELIMITER $$
	USE `test`$$
	DROP TRIGGER IF EXISTS `t1_before`$$
	CREATE 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;
	mysql> select * from t1;
		| id | name |
		| 12 | BBS  |
	mysql> select * from t2;
		| id | name |
		| 12 | BBS  |
NEW值,已经被修改。 after触发器代码:
	DELIMITER $$
	USE `test`$$
	DROP TRIGGER  IF EXISTS `t1_after`$$
	CREATE 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   |

	mysql> select * from t2;
		Empty set (0.00 sec)

	mysql> select * from t1;
		| id | name |
		|  1 | bbs  |
	mysql> select * from t2;
		| id | name |
		|  1 | aa   |