日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

触发器before和after的区别

發布時間:2025/3/20 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 触发器before和after的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

?

轉載于:https://blog.51cto.com/liang3391/813483

總結

以上是生活随笔為你收集整理的触发器before和after的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。