Postgresql存储过程--更新或者插入数据

原创 2012年03月21日 23:10:45

要记录某一时段机器CPU、内存、硬盘的信息,展示的时间粒度为分钟,但是为了精确,输入数据源的时间粒度为6s。这个统计过程可以在应用层做好,每分钟插入一次,也可以在数据库层写个存储过程来完成,根据传入数据的时间来判断是更新数据库旧数据还是插入新数据。

同时,这些数据只需要保留一周,更老的数据需要被删除。删除动作可以每天定时执行一次,也可以写在存储过程中每次检查一下。

考虑到性能在此时没什么太大约束,而后面存储过程的接口方式更漂亮些,不用应用层去关心数据到底组织成什么样,因此实现了一个如下:

Postgresql V8.3

CREATE OR REPLACE FUNCTION insert_host_status(_log_date timestamp without time zone, _host inet, _cpu integer, _mem integer, _disk integer)
  RETURNS void AS
$BODY$
DECLARE
    new_start timestamp without time zone;
    current_start timestamp without time zone;
    c_id integer;
    c_log_date timestamp without time zone;
    c_cpu integer;
    c_mem integer;
    c_disk integer;
    c_count integer;
    date_span interval;
BEGIN
    -- insert or update
    SELECT id, log_date, cpu, mem, disk, count INTO c_id, c_log_date, c_cpu, c_mem, c_disk, c_count FROM host_status_byminute WHERE host=_host ORDER BY id DESC limit 1;
    SELECT timestamp_mi(_log_date, c_log_date) INTO date_span;
    IF date_span >= '00:00:60' OR c_id IS NULL THEN
        INSERT INTO host_status_byminute (log_date, host, cpu, mem, disk, count) values (_log_date, _host, _cpu, _mem, _disk, 1);
    ELSIF date_span >= '-00:00:60' THEN
        c_mem := ((c_mem * c_count) + _mem)/(c_count + 1);
        c_cpu := ((c_cpu * c_count) + _cpu)/(c_count + 1);
        c_disk := ((c_disk * c_count) + _disk)/(c_count + 1);
        c_count := c_count + 1;
        UPDATE host_status_byminute SET mem=c_mem, cpu=c_cpu, disk=c_disk, count=c_count WHERE id=c_id;
    END IF;
    -- delete old data
    SELECT date_mii(date(now()), 6) INTO new_start;
    SELECT date(log_date) from host_status_byminute limit 1 INTO current_start; -- omit a bug happened when date is disordered.
    IF new_start > current_start THEN
        DELETE FROM host_status_byminute where log_date < new_start;
    END IF;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION insert_host_status(timestamp without time zone, inet, integer, integer, integer) OWNER TO dbuser_test;



postgres 使用存储过程批量插入数据

postgres sql plpgsql 存储过程 循环
  • qq798618048
  • qq798618048
  • 2014年07月02日 17:25
  • 2183

POSTGRESQL 存储过程 select into 和 insert into select 两种表复制语句之间的差别

POSTGRESQL 存储过程 select into 和 insert into select 两种表复制语句之间的差别
  • IT_ziliang
  • IT_ziliang
  • 2015年11月06日 12:54
  • 3237

关于PostgreSQL向数据库表中添加行数据

实现向PostGreSQL快速插入行数据
  • a519986543
  • a519986543
  • 2016年12月13日 14:34
  • 1095

postgres存储过程的创建及其返回类型

postgres存储过程的创建及其返回类型
  • abcbetty_soft
  • abcbetty_soft
  • 2017年04月12日 13:19
  • 685

postgresql函数中的赋值运算和postgresql函数存储过程实现数据批量插入

  今天检查大家写的postgresql函数时,发现有的家伙不遵守postgresql关于函数中的赋值运算表示方式:variable := value注意的是,是:=表示赋值运算,而不是单独一个等号...
  • xianyiqi
  • xianyiqi
  • 2009年03月06日 09:32
  • 6199

postgresql函数存储过程实现数据批量插入

创建函数:create function insert_page(text,char,char,char,char,text,text,text,text,text,text,text,text,te...
  • jackyren007
  • jackyren007
  • 2008年07月04日 09:07
  • 3103

postgresql更新序列的起始值

迁移老数据到新的数据库,需要把id迁移过来,这时序列值就需要修改为当前最大值加1了。 使用这个语句就可以让s_seq的序列值从7开始了。 alter sequence s_seq restart ...
  • baidu_18607183
  • baidu_18607183
  • 2016年04月18日 17:35
  • 3756

PostgreSQL数据库如果不存在则插入,存在则更新

今天在做接手别人项目的时候,有这样的需求,往数据库中插入数据的时候,要满足下面: 1、如果数据库存在一条记录,则将新插入的值,作为更新 2、如果没有这样一条记录,则新增。 以...
  • likawei1314
  • likawei1314
  • 2018年01月10日 22:40
  • 264

PostgreSQL数据库如何快速插入大量数据

PostgreSQL数据库如何快速插入大量数据背景在一些应用场景中,需要向PostgreSQL数据库中快速装入大量的数据,比如数据库迁移,SQL日志分析等。在Abase上快速插入数据有几种方案,每种方...
  • wangzhen3798
  • wangzhen3798
  • 2017年12月11日 12:57
  • 579

mysql利用存储过程批量插入数据

最近需要测试一下mysql单表数据达到1000W条以上时增删改查的性能。由于没有现成的数据,因此自己构造,本文只是实例,以及简单的介绍。 首先当然是建表: CREATE TABLE `fortes...
  • sdlyjzh
  • sdlyjzh
  • 2014年10月30日 11:36
  • 20088
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Postgresql存储过程--更新或者插入数据
举报原因:
原因补充:

(最多只允许输入30个字)