关于UPDATE的问题(update之前利用触发器判断一下数据,是否需要UPDATE)

时间:2023-01-19 05:06:50
从上位机系统中采集大量实时数据点,需要短时间(10秒)的不断更新(老板很扣,不想买实时数据库),想把数据不断更新到数据库中。

其实绝大部分的数据在一定时间内都很少有改变的,如果每个点都update一下,效率太低了,就想能不能通过触发器,在update之前,检查一下这个测点的数据,是否改变了,如果改变了,就继续update,如果没改变,则中止这个点数据的更新。

表结构如下:

监测点数据表(监测点ID,监测点名称,监测点值,变比)

希望触发器 在UPDATE 监测点数据之前,判断UPDATE的新值是否与旧值相同,如果没有变化,则中止这个测点的数据UPDATE,否则更新这个测点的数据。

请问各位高手,可不可以实现?

11 个解决方案

#1


create trigger ut_监测点数据表 on 监测点数据表
instead of update
as
if exists(select * from inserted i,deleted d where i.监测点ID=d.监测点ID and isnull(i.监测点值,0)<>isnull(d.监测点值,0))
begin
update 监测点数据表 
set 监测点数据表.监测点值=i.监测点值
from 监测点数据表,inserted i,deleted d
where 监测点数据表.监测点ID=i.监测点ID and i.监测点ID=d.监测点ID and isnull(i.监测点值,0)<>isnull(d.监测点值,0)
end

#2


学习

#3


UP

#4


学习学习!~~~

#5


其实只要有for update触发器就行,没有更新是不会触发的

#6


支持yesyesyes的说法,只要FOR update就可以了。
另外我觉得数据库结构能不能改一下:增加一个监测时间,记下每次修改的时间。这样只要针对有最新检测时间的记录进行处理,系统的运行效率比较高,而且写程序也简单。

#7


其实只要有for update触发器就行,没有更新是不会触发的
-----------------------------------------------------
是这样的吗?看下面的测试

drop table tabletest

create table tabletest(id int)

insert into tabletest(id)
select 10

create trigger tu_tabletest on tabletest
for update
as
print '触发过'

update tabletest
set id = 10
where id = 10
--这条语句会打印出'触发过'

不知道分析得对不对,请见谅!

#8


在Oracle中,触发器是有UPDATE之前,UPDATE之后,插入之前、插入之后这样的写法。但sql server我不太清楚。
至于触发器内部,是否有数据的自我判断功能,还真不清楚,这可能要了解得更深入才行,比喻触发器的工作机制。

我现在还没有测试,明天向大家报告效果。

#9


回 :ljs1519() ( ) 信誉:100    Blog 

     我只要保存实时的监测点的数据,方便集成在MIS中,让办公室人员查看实时的情况。不需要做趋势分析,所以没必要时间字段。

#10


update tabletest
set id = 10
where id = 10
=======
这就是更新啊

#11


zltion:明白了,前面我的理解有问题。

#1


create trigger ut_监测点数据表 on 监测点数据表
instead of update
as
if exists(select * from inserted i,deleted d where i.监测点ID=d.监测点ID and isnull(i.监测点值,0)<>isnull(d.监测点值,0))
begin
update 监测点数据表 
set 监测点数据表.监测点值=i.监测点值
from 监测点数据表,inserted i,deleted d
where 监测点数据表.监测点ID=i.监测点ID and i.监测点ID=d.监测点ID and isnull(i.监测点值,0)<>isnull(d.监测点值,0)
end

#2


学习

#3


UP

#4


学习学习!~~~

#5


其实只要有for update触发器就行,没有更新是不会触发的

#6


支持yesyesyes的说法,只要FOR update就可以了。
另外我觉得数据库结构能不能改一下:增加一个监测时间,记下每次修改的时间。这样只要针对有最新检测时间的记录进行处理,系统的运行效率比较高,而且写程序也简单。

#7


其实只要有for update触发器就行,没有更新是不会触发的
-----------------------------------------------------
是这样的吗?看下面的测试

drop table tabletest

create table tabletest(id int)

insert into tabletest(id)
select 10

create trigger tu_tabletest on tabletest
for update
as
print '触发过'

update tabletest
set id = 10
where id = 10
--这条语句会打印出'触发过'

不知道分析得对不对,请见谅!

#8


在Oracle中,触发器是有UPDATE之前,UPDATE之后,插入之前、插入之后这样的写法。但sql server我不太清楚。
至于触发器内部,是否有数据的自我判断功能,还真不清楚,这可能要了解得更深入才行,比喻触发器的工作机制。

我现在还没有测试,明天向大家报告效果。

#9


回 :ljs1519() ( ) 信誉:100    Blog 

     我只要保存实时的监测点的数据,方便集成在MIS中,让办公室人员查看实时的情况。不需要做趋势分析,所以没必要时间字段。

#10


update tabletest
set id = 10
where id = 10
=======
这就是更新啊

#11


zltion:明白了,前面我的理解有问题。