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

pgsql触发器:当向一张表中插入或更新一条记录时,同时向另一张表也插入或更新一条记录

发布网友 发布时间:2022-04-08 09:26

我来回答

2个回答

懂视网 时间:2022-04-08 13:47

计算平均值

PostgreSQL计算平均值的sql类似如下:

with s as (select cast(load_15 as float) from asset_serverstatus where sid_id=10 order by id desc limit 10) select avg(load_15) from s

触发器函数

CREATE OR REPLACE FUNCTION fn_status_loadavg_insert()
 RETURNS trigger AS
$BODY$
BEGIN
 update asset_serverstatus set load_avg=(
 with s as (select cast(load_15 as float) from asset_serverstatus where sid_id=new.sid_id order by id desc limit 10) select avg(load_15) from s
 ) where id=new.id;
return new;
END;
$BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100;

用pgsql写了个触发器的函数,基本思路其实就是更新。

为表添加触发器

CREATE TRIGGER trg_status_loadavg_insert
 AFTER INSERT
 ON asset_serverstatus
 FOR EACH ROW
 EXECUTE PROCEDURE fn_status_loadavg_insert();

这样PostgreSQL数据库中根据某条件,取某字段的平均值,然后插入到另外一个字段的实现就完成了。

记录下。

热心网友 时间:2022-04-08 10:55

digoal=# create table a (aid int primary key, aname text, time timestamp);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "a_pkey" for table "a"
CREATE TABLE
digoal=# create table b (id int primary key, name text, time timestamp);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "b_pkey" for table "b"
CREATE TABLE
digoal=# create or replace function tg_a () returns trigger as $$
declare
begin
case TG_OP
when 'INSERT' then
insert into b(id,name,time) values (NEW.aid, NEW.aname, NEW.time);
when 'UPDATE' then
update b set id=NEW.aid, name=NEW.aname, time=NEW.time where id=OLD.aid;
when 'DELETE' then
delete from b where id=OLD.aid;
when 'TRUNCATE' then
truncate b;
else
return NULL;
end case;
return NULL;
end;
$$ language plpgsql;
digoal=# create trigger tg_a after INSERT OR DELETE OR UPDATE ON a for each row execute procere tg_a();
CREATE TRIGGER
digoal=# create trigger tg_a_truncate after truncate ON a for each statement execute procere tg_a();
CREATE TRIGGER
digoal=# insert into a select generate_series(1,10),'digoal',clock_timestamp();
INSERT 0 10
digoal=# select * from a;
aid | aname | time
-----+--------+----------------------------
1 | digoal | 2013-02-03 18:59:37.592479
2 | digoal | 2013-02-03 18:59:37.592667
3 | digoal | 2013-02-03 18:59:37.592674
4 | digoal | 2013-02-03 18:59:37.592677
5 | digoal | 2013-02-03 18:59:37.59268
6 | digoal | 2013-02-03 18:59:37.592683
7 | digoal | 2013-02-03 18:59:37.592686
8 | digoal | 2013-02-03 18:59:37.59269
9 | digoal | 2013-02-03 18:59:37.592693
10 | digoal | 2013-02-03 18:59:37.592696
(10 rows)
digoal=# select * from b;
id | name | time
----+--------+----------------------------
1 | digoal | 2013-02-03 18:59:37.592479
2 | digoal | 2013-02-03 18:59:37.592667
3 | digoal | 2013-02-03 18:59:37.592674
4 | digoal | 2013-02-03 18:59:37.592677
5 | digoal | 2013-02-03 18:59:37.59268
6 | digoal | 2013-02-03 18:59:37.592683
7 | digoal | 2013-02-03 18:59:37.592686
8 | digoal | 2013-02-03 18:59:37.59269
9 | digoal | 2013-02-03 18:59:37.592693
10 | digoal | 2013-02-03 18:59:37.592696
(10 rows)
digoal=# delete from a where aid=1;
DELETE 1
digoal=# select * from b;
id | name | time
----+--------+----------------------------
2 | digoal | 2013-02-03 18:59:37.592667
3 | digoal | 2013-02-03 18:59:37.592674
4 | digoal | 2013-02-03 18:59:37.592677
5 | digoal | 2013-02-03 18:59:37.59268
6 | digoal | 2013-02-03 18:59:37.592683
7 | digoal | 2013-02-03 18:59:37.592686
8 | digoal | 2013-02-03 18:59:37.59269
9 | digoal | 2013-02-03 18:59:37.592693
10 | digoal | 2013-02-03 18:59:37.592696
(9 rows)
digoal=# select * from a;
aid | aname | time
-----+--------+----------------------------
2 | digoal | 2013-02-03 18:59:37.592667
3 | digoal | 2013-02-03 18:59:37.592674
4 | digoal | 2013-02-03 18:59:37.592677
5 | digoal | 2013-02-03 18:59:37.59268
6 | digoal | 2013-02-03 18:59:37.592683
7 | digoal | 2013-02-03 18:59:37.592686
8 | digoal | 2013-02-03 18:59:37.59269
9 | digoal | 2013-02-03 18:59:37.592693
10 | digoal | 2013-02-03 18:59:37.592696
(9 rows)

digoal=# update a set aname='new' where aid=2;
UPDATE 1
digoal=# select * from a where aid=2;
aid | aname | time
-----+-------+----------------------------
2 | new | 2013-02-03 18:59:37.592667
(1 row)
digoal=# select * from b where id=2;
id | name | time
----+------+----------------------------
2 | new | 2013-02-03 18:59:37.592667
(1 row)
digoal=# truncate a;
TRUNCATE TABLE
digoal=# select * from a;
aid | aname | time
-----+-------+------
(0 rows)
digoal=# select * from b;
id | name | time
----+------+------
(0 rows)

参考资料:http://blog.163.com/digoal@126/

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么时候功率最大 最小 家电多少功率算高功率 大功率用电器在开启瞬间,需要比正常使用功率大很多的启动电流,这是为什 ... 大功率电器设备为什么不能一下开到最大 有一个节能灯突然坏了,是哪个件坏了? 我不知道是节能灯坏了,还是开关面板坏了,按下开关面板时,节能灯有时... 为什么节能灯老是烧坏 湖州南太湖新区包括龙之梦吗 南太湖新区有哪些地方 南太湖是哪里 领结婚证是否可不迁移户口?是否会影响到孩子呢? 领结婚证不迁户口算已婚吗 领了结婚证户口是不是就自动迁走了 iphone(苹果)手机死机后开不了机怎么办 苹果手机怎么快速删除通讯录的联系人 苹果开机就死机了怎么办 微信发送excel文件就卡停电脑,关机、微信重新下载都不管用 现在有什么好玩的游戏啊~~ 单机的啊~~ 最好容量小点~~因为我懒的下~~ xixi qq农场牧场偷匪V6.9.1官网,qq农场牧场偷匪V6.9.1下载,qq农场牧场偷匪V6.9.1xixi qq农场牧场偷匪V6.9西西 这个驾考宝典的试题是最新版吗?http://www.xixibus.com/soft/727.html 什么手机浏览器可以看水莓壹佰视频 钓鱼调漂找底遇到的问题 中国保监会调整取消2019 REACH&7P什么意思 2021年国家现在重视基础学科,大专报基础学科好就业吗? 空钩调5目下钩挂铅皮找底钓2目,和双钩挂颗粒调平水找底钓2目,所找出的底哪个更准确 女友7P是什么意思? 空调上的1p~7P是什么意思? 什么是4P或者(7P)理论?能否给个详细的说明,谢谢了。 什么软件能打开? 办结婚证女方可以不迁户口吗 领结婚证不迁户口需要户口本吗 领了结婚证户口是不是自动迁走了 领结婚证时只领证不迁户口可以吗? 领结婚证 可以不迁户口吗 绞菜机上在刀片上的螺丝生锈了还能用吗? 生锈的剃须刀片会感染吗? 刀生锈了怎么办 刀片生锈了,如何恢复光泽? 能重新注册身份证号么 我想要个可以注册穿越火线的身份证号码 要写的到的 关于注册身份证号码的问题? java输入语句scanner 教学观摩反思怎么写 java输入语句怎么写 根据户口本上身份证号能注册12306吗 怎么看自己实名注册的身份证号呀! JAVA 的输入语句 他们真的合作了吗——小学音乐课堂合作学习的反思 利用身份证号可以注册什么