有两个表,一个入库单,一个发货单,两个的基本格式如下:
id 温度 批号
1 50 001
2 60 002入库的时候批号和温度都是填好了的,现在我想让发货的时候我选择了批号则自动带出温度来,这个触发器我也会写:
update 发货单 set 发货单.温度=入库单.温度 where 发货单批号=入库单.批号
大概增加个这样的触发器就行了,但是有个问题就是现在发货单和入库单的数量太多了,如果每增加一张发货单就执行一下这个触发器的话保存的时间很长,大约一分钟左右客户接受不了,我想请教下大家能不能更新温度的时候只更新我新增加的那张发货单,以前那些更新过的就不计算,这样才能达到提高效率的作用
id 温度 批号
1 50 001
2 60 002入库的时候批号和温度都是填好了的,现在我想让发货的时候我选择了批号则自动带出温度来,这个触发器我也会写:
update 发货单 set 发货单.温度=入库单.温度 where 发货单批号=入库单.批号
大概增加个这样的触发器就行了,但是有个问题就是现在发货单和入库单的数量太多了,如果每增加一张发货单就执行一下这个触发器的话保存的时间很长,大约一分钟左右客户接受不了,我想请教下大家能不能更新温度的时候只更新我新增加的那张发货单,以前那些更新过的就不计算,这样才能达到提高效率的作用
它本来就是有时间列的,但是怎么加呢?而且加了能管用么,本来我原来还是加了个id的条件的,比如说只更新id>3000的,但是我加了那个条件后我新增加发货单保存的时候温度就不更新,我也不知道是怎么回事,请赐教!
这个最后的inserted.批号是不是应该改成入库单.批号?还有中间那个inserted.温度,如果你说是新增的话保存的时候温度应该还没有新增吧,应该更新了之后才有温度啊?能详细解释一下么,我对触发器还不是太了解,谢谢!
触发器按照触发时机,可分为两种:
1、事前触发:这个是在表中的数据没有变化之前执行
2、事后触发:不用说,这是在表中的数据变化后执行
触发器按照触发条件,可分为三种:
1、插入数据触发
2、修改数据触发
3、删除数据触发综合看,就是每种条件都有事前和事后的情况。但sqlserver的事前触发只可以写一个,事后可以写多个。
与该表对应的有两个逻辑表:
1、inserted:在做insert和update操作时,保存了该表的新数据
2、deleted:在做update和delete操作时,保存了该表的旧数据所以当你写触发器,要得到刚刚insert的数据时,就可以在触发器里写
select * from inserted
事前触发是这种形式
create tigger xxx
on tab
instead of insert事后触发是这种形式
create tigger xxx
on tab
for insert事前触发因为数据只是在inserted表里,还没有真正进入实表中,所以可以根据需要把
inserted表里的数据插入实表中