MySQL 触发器

触发器:当执行某个事件的时候触发另一个事件的执行。触发的时间分为before和after,分别有以下六种:before insert,before update,before delete和after insert,after update,after delete。

FOR EACH ROW 子句通知触发器每隔一行执行一次动作,而不是对整个表,在触发器中我们经常会用到NEWOLD这两个关键字!其中NEW是指刚刚插入到数据库的数据表中的一个域,也可以理解为对象(object)的意思。比如在一个insert触发器中我用到了NEW那他的意思就是说,要使用刚刚插入到数据表的某个值,要使用具体的某一个值的话需要这样子写:NEW.字段名(NEW.username)这样子就获取到了刚刚插入到数据表中的一个字段的值!OLD是在delete触发器中有用的,意思是说我要删除一条数据,但是在触发器中要用到之前的那个数据,那么我就可以通过OLD来获取了!比如我删除了一条数据,里面包含一个email,现在我在触发器的内部sql中要用就可以这样子写:OLD.email!

对于INSERT语句, 只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句可以在
NEW以及OLD同时使用。

下面举例说明:

before触发器代码:
TRIGGER 触发器名称 BEFORE UPDATE ON 表名A
FOR EACH ROW
BEGIN
set NEW.id=NEW.id+11;
set NEW.name=UPPER(NEW.name);
INSERT INTO 表名B VALUES (NEW.id,NEW.name);
END

mysql> update A set name=’bbs’ where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from A;
+—-+——+
| id | name |
+—-+——+
| 12 | BBS  |
+—-+——+
1 row in set (0.00 sec)
mysql> select * from B;
+—-+——+
| id | name |
+—-+——+
| 12 | BBS  |
+—-+——+
1 row in set (0.00 sec)
NEW值,已经被修改。
========================================================================
after触发器代码:


    TRIGGER 触发器名称 AFTER UPDATE ON A
FOR EACH ROW
BEGIN
set NEW.id=NEW.id+11;
set NEW.name=UPPER(NEW.name);
INSERT INTO B VALUES (NEW.id,NEW.name);
END

把before触发器删除,在重新建立触发器的时候会报错,报错信息如下:由于是after触发器,不能对NEW值修改,所以报错。

所以,after触发器就改成了如下:
TRIGGER 触发器名称 AFTER UPDATE ON A
FOR EACH ROW
BEGIN
— set NEW.id=NEW.id+11;   这是注释的语句
— set NEW.name=UPPER(NEW.name);  这是注释的语句
INSERT INTO B VALUES (OLD.id,OLD.name);
END
mysql> select * from A;
+—-+——+
| id | name |
+—-+——+
|  1 | aa   |
+—-+——+
1 row in set (0.00 sec)
mysql> select * from B;
Empty set (0.00 sec)
mysql> update A set name=’bbs’ where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from A;
+—-+——+
| id | name |
+—-+——+
|  1 | bbs  |
+—-+——+
1 row in set (0.00 sec)
mysql> select * from B;
+—-+——+
| id | name |
+—-+——+
|  1 | aa   |
+—-+——+
1 row in set (0.00 sec)

After Update 将数据更新完后,触发。更新新表的数据来自未更新前的那条语句。

参考网站:

1、http://www.cnblogs.com/zzwlovegfj/archive/2012/07/04/2576989.html

2、http://www.cnblogs.com/zzwlovegfj/archive/2012/07/05/2578574.html

MySQL 触发器》上有1条评论

发表评论

电子邮件地址不会被公开。