数据库sqlserver-----触发器的插入,更新和删除

news/2024/11/27 23:44:11/

在学习触发器之前,先弄清DDL,DML,DQL,DCL的区别:

http://t.csdn.cn/Le3wA

触发器就是当执行某个事件的时候触发另一个事件的执行,根据事件的触发时间可分为

before和after

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

但是在sqlserver没有类似Oracle、Postgresql数据库的before功能,这里主要讲after

提要:创建两个表:buy 和detail

create table buy(buyid int not null identity(1,1),-----------表示buyid自增name varchar(20) not null,cost decimal(8,2)
)create table detail(detailid int not null identity(1,1),buyid int not null,name varchar(20) not null,kind varchar(20) not null,oldcost decimal(8,2) null,newcost decimal(8,2) null,
)

关于自增函数和数据类型的补充可以看这篇,这里不细讲:

自增函数:

http://t.csdn.cn/u1VAX

数据类型:

http://t.csdn.cn/AVGMk

 两张虚拟表inserted,deleted

1.触发器的插入操作:

create trigger tri_buy_insert on buy
after insert
asinsert into detail(buyid,name,kind,oldcost,newcost)select inserted.buyid,inserted.name,'新增',0.0,inserted.costfrom inserted,buywhere inserted.buyid=buy.buyid

在buy表中插入数据之前,两张表都为空

在buy表中插入一个数据之后:

insert into buy values('薯片',7.50)

不能写为

insert into buy values(1,'薯片',7.50)

否则会报:

仅当使用了列列表并且 IDENTITY INSERT 为 ON 时,才能为表'buy'中的标识列指定显式值。

第一个字段是自增的,插入时不需要赋值

插入后,则会看到:

 

2.触发器的更新操作:

1.

create trigger tri_buy_update on buy
after update
as insert into detail(buyid,name,kind,oldcost,newcost)select inserted.buyid,inserted.name,'更新',deleted.cost,inserted.costfrom inserted,deleted,buywhere inserted.buyid=buy.buyidand deleted.buyid=buy.buyid

此时再更新一下buy表:

update buy set cost=6.7
where name='薯片'

得到效果如下:
 

触发器的删除操作:

instead of触发器是在insert、update、delete这些操作进行之前就被激活了,并且不再去执行原来的dml SQL操作,而是用触发器内部的SQL语句代替执行。

所以用了instead of的表做任何dml操作,都只会执行触发器内部的语句

   一个table或者view只能有一个instead of

   原始dml语句还是不会执行

这里用after和instead of执行效果是一样的

create trigger tri_buy_delete on buy
instead of delete
asinsert into detail(buyid,name,kind,oldcost,newcost)select deleted.buyid,deleted.name,'删除',deleted.cost,0.00 from deleted,buywhere deleted.buyid=buy.buyid

执行删除操作

delete from buy where name='薯片'

得到结果:


 

更新进阶:

2.

加入一张新表:calc,如下图:

	create table calc(maxcost decimal(8,2) null,mincost decimal(8,2) null,totalcost decimal(8,2) null,avgcost decimal(8,2) null
)

刚开始表为:

实现:

若calc为空,则插入新数据,若calc表不为空,则更新数据:

create trigger tri_buy_insert1 on buy
after insert
asif not exists(select * from calc)begininsert into calc(maxcost,mincost,totalcost,avgcost)select max(cost),min(cost),sum(cost),avg(cost)from cys_351_buyendelsebeginupdate calc setmaxcost=(select max(cost) from buy),mincost=(select min(cost) from buy),totalcost=(select sum(cost) from buy),avgcost=(select avg(cost) from buy)end

第一次插入数据结果呈现:

 再次插入一个数据:

insert into buy values('冰淇淋',5.5)

 得到结果:

对于trigger before的替代方案:

http://t.csdn.cn/UB3gC

还在学习阶段,学习到新知识会不断补充


http://www.ppmy.cn/news/105241.html

相关文章

rsync删除同步出错,rsync: failed to set times on ‘xxxx‘: Operation not permitted

错误消息 “rsync: failed to set times on ‘xxxx’: Operation not permitted” 表示在执行 rsync 命令时无法设置文件的时间属性。这通常是因为你没有足够的权限来更改文件的时间戳。 要解决这个问题,你可以尝试以下方法: 使用管理员权限执行 rsync …

并发编程 原子性 可见性 有序性

并发编程的三个重要特性 原子性所谓原子性是指在一次的操作或者多次操作中,要么所有的操作全部都得到了执行并且不会受到任何因素的干扰而中断,要么所有的操作都不执行。可见性可见性是指,当一个线程对共享变量进行了修改,那么另…

Spring Boot注解的使用细节

RequestParam: 1、在前端传入多个相同的属性时,若使用数组接收,则无需使用RequestParam注解。若使用集合接收,则须使用RequestParam来绑定参数。 2、当前端发送的属性名与服务端接收的不一致时,可以使用RequestParam&a…

java-反射

反射 示例代码 import java.lang.reflect.*; public class Example {public static void main(String[] args) throws Exception {// 获取 Class 对象Class<?> clazz Class.forName("java.lang.String");// 获取类名、包名和修饰符String className clazz…

产品经理-产品驱动增长3-共识体验

公式&#xff1a;增长需求方案共识体验场域效率口碑流量&#xff0c;篇幅问题&#xff0c;这篇我们讲两个&#xff0c;分别是共识和体验 一、共识 前面我们研究了需求和方案&#xff0c;用介绍的方法已经为G公司和K公司的产品分别梳理了一条核心需求&#xff0c;并且还有三个方…

华为OD机试真题B卷 Java 实现【停车场车辆统计】,附详细解题思路

一、题目描述 特定大小的停车场&#xff0c;数组cars[]表示&#xff0c;其中1表示有车&#xff0c;0表示没车。 车辆大小不一&#xff0c;小车占一个车位&#xff08;长度1&#xff09;&#xff0c;货车占两个车位&#xff08;长度2&#xff09;&#xff0c;卡车占三个车位&a…

操作系统期末复习——课时十内存管理(一)

1、内存管理的基本原理和要求 1&#xff09;内存管理的定义 操作系统对内存的划分和动态分配就是内存管理的概念。 2&#xff09;内存管理的功能 &#xff08;1&#xff09;内存空间的分配和回收&#xff1a;由操作系统完成对主存的分配和回收&#xff0c;对编程人员透明。 &…

最热门高效的Node.JS开源第三方开发库和特点(持续更新......)

目录 1. Express 2. Socket.io 3. Mongoose 4. Passport 5. Async 6. PM2 7. Nodemailer 8. Request 9. Cheerio 10. Lodash 11. Bluebird 12. Winston 13. Socket.io-client 14. Node-sass 15. Moment 16. Gulp 17. Grunt 18. Chai 19. Sinon 20. Nodemon…