问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

数据库触发器中FOR 和AFTER有什么区别啊

发布网友 发布时间:2022-04-08 02:27

我来回答

2个回答

懂视网 时间:2022-04-08 06:48

before:(insert、update)可以对new进行修改,after不能对new进行修改,两者都不能修改old数据。

 

对于INSERT语句, 只有NEW是合法的;

对于DELETE语句,只有OLD才合法;

对于UPDATE语句,NEW、OLD可以同时使用。

 

例子如下:

1 mysql> select * from t1; 
2 +----+-------+
3 | id | name |
4 +----+-------+
5 | 1 | zhang |
6 +----+-------+

 

1 mysql> delimiter //
2 mysql> create trigger tb before update on t1 
3 -> for each row
4 -> begin
5 -> set NEW.id=NEW.id+5;
6 -> set NEW.name=upper(NEW.name);
7 -> insert into t2 values(NEW.id,NEW.name);
8 -> end;//

 

1 分隔符换回分号
2 mysql> delimiter ;

 

 1 mysql> update t1 set name=‘huang‘ where id=1;
 2 Query OK, 1 row affected (0.01 sec)
 3 Rows matched: 1 Changed: 1 Warnings: 0
 4 
 5 mysql> select * from t1 ;   
 6 +----+-------+
 7 | id | name |
 8 +----+-------+
 9 | 6 | HUANG |
10 +----+-------+
11 1 row in set (0.00 sec)
1 mysql> select * from t2;
2 +----+-------+
3 | id | name |
4 +----+-------+
5 | 6 | HUANG |
6 +----+-------+
7 1 row in set (0.00 sec)

 

由上可知,如果trigger用的是before,则可以修改new的值,并写入到数据库中

 

 1 同样的代码,把before改成after,则会报错
 2 mysql> delimiter //
 3 mysql> create trigger ta after update on t1 
 4 -> for each row
 5 -> begin
 6 -> set NEW.id=NEW.id+5;
 7 -> set NEW.name=upper(NEW.name);
 8 -> insert into t2 values (NEW.id,NEW.name);
 9 -> end;//
10 ERROR 1362 (HY000): Updating of NEW row is not allowed in after trigger

 

将after内容改写如下:运行正常

 1 mysql> delimiter //
 2 mysql> create trigger ta after update on t1 for each row
 3 -> begin
 4 -> insert into t2 values (OLD.id,NEW.name);
 5 -> end;//
 6 Query OK, 0 rows affected (0.00 sec)
 7 
 8 mysql> delimiter ;
 9 mysql> update t1 set name=‘chen‘ where id=6;
10 
11 mysql> select * from t1;
12 +----+------+
13 | id | name |
14 +----+------+
15 | 6 | chen |
16 +----+------+
17 1 row in set (0.00 sec)
18 
19 mysql> select * from t2;
20 +----+-------+
21 | id | name |
22 +----+-------+
23 | 6 | HUANG |
24 | 6 | chen |
25 +----+-------+
26 2 rows in set (0.00 sec)

 

 总结如下:

after—是在记录操纵之后触发,是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作
before—是在记录操纵之前触发,是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作,如:我们在触发之前需要判断new值和old值的大小或关系,如果满足要求就触发,不通过就修改再触发;如:表之间定义的有外键,在删除主键时,必须要先删除外键表,这时就有先后之分,这里before相当于设置了断点,我们可以处理删除外键。

 

数据库中触发器before与after认识

标签:

热心网友 时间:2022-04-08 03:56

你问的应该是before和after的区别吧。
before insert or update or delete指在插入/更新/删除之前触发了触发器,执行触发器中的内容;
after insert or update or delete指在插入/更新/删除之前触发了触发器,执行触发器中的内容。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
whirlpool如何制热 如何查被录取到的专业 怎样查被录取的专业 录取后怎样查询录取的专业 录取专业怎么查 已被录取怎么查专业 ghs网络语什么意思_ghs网络语意思出处含义介绍 纸箱企业管理软件 ghs什么意思网络(ghs什么意思网络用语) 《喜羊羊与灰太狼》大结局 什么是bios?什么是cmos?它们之间有什么区别和联系 电脑开机时bios的作用(急用) 有兮字的 名字 “BIOS是基本输入输出系统;”怎么理解它? 女孩名字中有兮.陌.黎.墨的笔名 BIOS的作用是什么? 带有兮字的名句,并说明意思 有兮这个姓吗???急 带有兮字两字的名字 有兮字的好听的名字,最好是两个字的 诗中带有兮字的诗句 为何《楚辞》中常带有兮字? 有兮字的诗 带有“兮”字的诗句 有兮字的成语 战国时期诗句中有兮的名句 带有兮字的古诗句 带有兮字唯美诗句 月兮花兮共有兮什么意思? 人佳有兮,见之不忘,是什么意思 劳动合同上的自我鉴定怎么写? 手机浏览器每次打开都弹出中国移动温馨提示弹窗,并且还会出现个小十字圆形图标,怎么样才能取消或者删除 求一篇关于劳动自我鉴定 参加家务劳动实浅的自我鉴定 荣耀30pro型号代码 猎豹WiFi的原理是什么?能不能用无线路由器取代? 缩水U盘量产,固定容量设置里实际容量和固定容量如何设置 纪梵希散粉饼还是nars好用 想买个定妆散粉或者蜜粉饼,在纪梵希四格散粉和nars蜜粉饼里纠结,感觉纪梵希更喜欢一点,可是不方便 纪梵希的粉饼哪种好 我想问一下大家是香奈尔的粉饼好用还是纪梵希的散粉 55寸小米电视2多少钱 55寸小米电视2售价多少 小米55寸液晶电视外观完好无损,但是开机没图像有声音,用手电筒侧照着有图像,能卖多少钱? 小米四电视55寸多少钱 小米3电视55寸多少钱 在朋友圈里道歉犯法吗 和朋友说错话了怎么发朋友圈 怎么发朋友圈让女朋友原谅自己 惹老婆生气了怎么发朋友圈道歉 历尽忙碌中忽略了爱的人怎么道歉发朋友圈?