达梦数据库的替代(instead of )触发器使用一例

1. 使用场景说明

在某些连续运行的数据库应用场景中,经常使用一段后台程序(通常做成守护进程)对数据进行自动入库,如气象或地震部门的资料收集成序就是这样,当源数据有修改时,也需要对数据库进行更新,使数据库中的数据保持最新。如果使用高级编程语言程序来实现也是可以的,但是有一个缺点,就是要多次查询数据库,一旦数据已存在,则进行update,否则进行插入操作。如果用instead触发器来做,高级语言程序则可以非常简单,且可以降低通信次数,效率将有所提高。

2. 场景举例

利用Instead of 触发器,首先利用new表检查是否满足数据插入条件,如果满足则进行插入,否则就进行更新。
比如有个气象台站的数据表如下:
站号 时间 气温 气压 雨量 风速 风向
56778 2021-01-12 13:00:00 12 1019 0 2 120
56765 2021-01-12 13:00:00 16 1011 0 3 135
56796 2010-01-12 13:00:00 18 900 3.5 4 232
… … … … … … …
一般台站正常情况下传上来的报文会即时入库,但有时仪器有偏差时,需要人工更正后再传更正报对预先插入的数据进行修正,这时由于数据库表中已有一条数据,需要对其进行修改,使数据库中的数据正确,用前端程序实现首先得判断有没有这条数据,有的话则更行update操作,否则进行insert操作。如果采用instead of 触发器实现,则可以很容易解决这个问题,客户端只须进行插入就可以了,不需要判断逻辑,程序将会清晰很多。

3. 实现

3.1 创建表

连接达梦数据库,创建一张weather的表:CREATE TABLE WEATHER(STATION_ID CHAR(5),RTIME TIMESTAMP,
TEMP FLOAT DEFAULT -273.15,PRESSURE FLOAT DEFAULT -999,RAIN FLOAT DEFAULT -999,WIND_V FLOAT,WIND_D FLOAT)

3.2 编写触发器

CREATE OR REPLACE TRIGGER tri_weather_insert
INSTEAD OF INSERT ON V_WEATHER–替换原来的insert语句
FOR EACH ROW
BEGIN
if not exists(SELECT * FROM WEATHER WHERE station_id=:new.station_id AND rtime=:new.rtime) THEN–没有则插入
INSERT INTO WEATHER(station_id,rtime,temp,pressure,rain,wind_v,wind_d) VALUES(:new.station_id,:new.rtime,:new.temp,:new.pressure,:new.rain,:new.wind_v,:new.wind_d);
ELSE --有则更新
UPDATE WEATHER SET temp=:new.temp,pressure=:new.pressure,rain=:new.rain,wind_v=:new.wind_v,wind_d=:new.wind_d
WHERE station_id=:new.station_id AND rtime=:new.rtime;
END IF;
END;

4.测试

4.1 预期结果

当向视图中插入一条新的记录时,表上应执行插入(INSERT)操作;当向视图中插入原有台站同一个时间的数据时,则执行更新(UPDATE)操作。

4.2 测试截图

插入三条记录后,表中记录如上图所示。当第一条记录的雨量(RAIN)更正为5时,再执行一条如下的语句,则表中的记录变为:
在这里插入图片描述插入三条记录后,表中记录如上图所示。当第一条记录的雨量(RAIN)更正为5时,再执行一条如下的语句,则表中的记录变为:
在这里插入图片描述这样就实现了气象台站数据的自动更正,不需要采用前端代码进行数据逻加判断。

5.结束语

采用数据库触发器、存储过程可以提高程序的通信效率,可以简化编程。作为数据库管理、开发员或数据架构师,有时需要从数据库的角度去帮助团队考虑数据架构的优化问题,使自已在团队中获得加分。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值