触发器before和after的区别
Before與After區(qū)別:before:(insert、update)可以對(duì)new進(jìn)行修改。
?????????????????? after不能對(duì)new進(jìn)行修改。
?????????????????? 兩者都不能修改old數(shù)據(jù)。
?
觸發(fā)器,顧名思義,就是當(dāng)執(zhí)行某個(gè)事件的時(shí)候觸發(fā)另一個(gè)事件的執(zhí)行!這個(gè)觸發(fā)的時(shí)間分為BEFORE和AFTER兩種,分別有before insert,before update,before delete和after insert,after update,after delete這六種情況
以下的文章主要向大家講述的是MySQL觸發(fā)器的實(shí)際使用詳細(xì)說(shuō)明與實(shí)際案例分析,同時(shí)本文也列舉了一些在MySQL觸發(fā)器的實(shí)際式操作中的代碼,以下就是文章的詳細(xì)內(nèi)容介紹,望大家借鑒。原文地址:http://database.51cto.com/art/201005/200671.htm
FOR EACH ROW 子句通知觸發(fā)器每隔一行執(zhí)行一次動(dòng)作,而不是對(duì)整個(gè)表,在觸發(fā)器中我們經(jīng)常會(huì)用到NEW和OLD這兩個(gè)關(guān)鍵字,在這里我還是先解釋下這兩個(gè)字的意思!其中NEW是指剛剛插入到數(shù)據(jù)庫(kù)的數(shù)據(jù)表中的一個(gè)域,也可以理解為對(duì)象(object)的意思。比如在一個(gè)insert觸發(fā)器中我用到了NEW那他的意思就是說(shuō),要使用剛剛插入到數(shù)據(jù)表的某個(gè)值,要使用具體的某一個(gè)值的話需要這樣子寫:NEW.字段名(NEW.username)這樣子就獲取到了剛剛插入到數(shù)據(jù)表中的一個(gè)字段的值!!OLD,OLD是在delete觸發(fā)器中有用的,意思是說(shuō)我要?jiǎng)h除一條數(shù)據(jù),但是在觸發(fā)器中要用到之前的那個(gè)數(shù)據(jù),那么我就可以通過(guò)OLD來(lái)獲取了!比如我刪除了一條數(shù)據(jù),里面包含一個(gè)email,現(xiàn)在我在觸發(fā)器的內(nèi)部sql中要用就可以這樣子寫:OLD.email!
對(duì)于INSERT語(yǔ)句, 只有NEW是合法的;對(duì)于DELETE語(yǔ)句,只有OLD才合法;而UPDATE語(yǔ)句可以在
和NEW以及OLD同時(shí)使用。
?
下面舉例說(shuō)明:
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觸發(fā)器代碼:
| DELIMITER $$
??? END$$ |
?
?
?
?
?
?
?
?
?
?
?
?
?
?
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值,已經(jīng)被修改。
========================================================================
after觸發(fā)器代碼:
?
| 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觸發(fā)器刪除,在重新建立觸發(fā)器的時(shí)候會(huì)報(bào)錯(cuò),報(bào)錯(cuò)信息如下:
由于是after觸發(fā)器,不能對(duì)NEW值修改,所以報(bào)錯(cuò)。
?
所以,after觸發(fā)器就改成了如下:
?
| 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
?
轉(zhuǎn)載于:https://blog.51cto.com/liang3391/813483
總結(jié)
以上是生活随笔為你收集整理的触发器before和after的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第2.02节 下载源码
- 下一篇: Windows Phone开发(18):