postgresql 按小时分表(含触发器)的实现方式

本人后端开发,因为业务需求需要使用分表方式进行数据存储。结合网上的资料最后使用的以下方式:

CREATE OR REPLACE FUNCTION auto_insert_into_tbl_partition()
 RETURNS trigger AS
$BODY$
DECLARE
  time_column_name   text ;      -- 父表中用于分区的时间字段的名称[必须首先初始化!!]
  curMM     varchar(16);    -- 'YYYYMM'字串,用做分区子表的后缀
  isExist     boolean;    -- 分区子表,是否已存在
  strSQL     text;

BEGIN
  -- 调用前,必须首先初始化(时间字段名):time_column_name [直接从调用参数中获取!!]
  time_column_name := TG_ARGV[0];

  -- 判断对应分区表 是否已经存在?
  EXECUTE 'SELECT $1.'||time_column_name INTO strSQL USING NEW;
  curMM := to_char( strSQL::timestamp , 'YYYYMMDDHH' );
  select count(1) INTO isExist from pg_class where relname = ('t_audit_'||curMM);

  -- 若不存在, 则插入前需 先创建子分区
  IF ( isExist = false ) THEN
    -- 创建子分区表
    strSQL := 'CREATE TABLE IF NOT EXISTS t_audit_'||curMM||'() INHERITS (t_audit);' ;
    EXECUTE strSQL;
    -- 创建索引
    strSQL := 'CREATE INDEX t_audit_'||curMM||'_INDEX_'||time_column_name||' ON t_audit_'||curMM||' ('||time_column_name||');' ;
    EXECUTE strSQL;
  END IF;

  -- 插入数据到子分区!
  strSQL := 'INSERT INTO t_audit_'||curMM||' SELECT $1.*' ;
  EXECUTE strSQL USING NEW;
  RETURN NULL;
END
$BODY$
 LANGUAGE plpgsql;

我是按照小时对固定的一张表进行分表的,其实可以写活就是加个变量,拼sql的时候拼接进去。这个就是写个函数作为触发器的回调函数。就先判断一下这个表有没有,有就直接插,没有就建表再插。

CREATE TRIGGER insert_tbl_partition_trigger
 BEFORE INSERT
 ON t_audit
 FOR EACH ROW
 EXECUTE PROCEDURE auto_insert_into_tbl_partition('time');

建一个触发器,在父表的插入数据的时候执行前面的那个回调函数。

ps:下面看下postgresql 表触发器

1、先建一个函数,用来执行触发器启动后要执行的脚本

CREATE OR REPLACE FUNCTION "public"."trigger_day_aqi"()
 RETURNS "pg_catalog"."trigger" AS $BODY$
BEGIN
  --日均值表,没有o3,小时值表,没有o3_8h
   NEW.so2iaqi=DAY_SO2_AQI(NEW.so2);
     NEW.no2iaqi=DAY_NO2_AQI(NEW.no2);
     NEW.coiaqi=DAY_CO_AQI(NEW.co);
     NEW.o3_8hiaqi=O3_8_AQI(NEW.o3_8h);
     NEW.pm10iaqi=PM10_AQI(NEW.pm10);
     NEW.pm25iaqi=PM25_AQI(NEW.pm25);
     NEW.aqi=NEW.coiaqi;
     NEW.primarypol='CO';
    IF NEW.aqi<NEW.no2iaqi  then  NEW.aqi=NEW.no2iaqi;  NEW.primarypol='NO2';  end if;
    IF NEW.aqi<NEW.so2iaqi  then  NEW.aqi=NEW.so2iaqi;  NEW.primarypol='SO2';  end if;
    IF NEW.aqi<NEW.o3_8hiaqi then  NEW.aqi=NEW.o3_8hiaqi;  NEW.primarypol='O3_8H'; end if;
    IF NEW.aqi<NEW.pm10iaqi then  NEW.aqi=NEW.pm10iaqi;  NEW.primarypol='PM10';  end if;
    IF NEW.aqi<NEW.pm25iaqi then  NEW.aqi=NEW.pm25iaqi;  NEW.primarypol='PM2.5'; end if;
    IF NEW.aqi<=50      then  NEW.primarypol='-';   end if;
     NEW.aqilevel=getRank(NEW.aqi);
  RETURN NEW;
END;
$BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100

2、建表的触发器,

CREATE TRIGGER gk_site_day_insert BEFORE INSERT ON gk_site_day
  FOR EACH ROW EXECUTE PROCEDURE trigger_day_aqi();

总结

以上所述是小编给大家介绍的postgresql 按小时分表(含触发器)的实现方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • Python连接PostgreSQL数据库的方法

    前言 其实在Python中可以用来连接PostgreSQL的模块很多,这里比较推荐psycopg2.psycopg2安装起来非常的简单(pip install psycopg2),这里主要重点介绍下如何使用. 连接数据库: import psycopg2 conn = psycopg2.connect(host="10.100.157.168",user="postgres",password="postgres",database="

  • Linux CentOS 7安装PostgreSQL9.3图文教程

    如题,本篇blog记录一下在Linux CentOS 7中安装PostgresSQL的整个过程以及数据库配置等,在Linux系统中,PostgreSQL的安装方式分两种,分别是: 1.二进制安装包安装 2.源码编译安装 由于我们没有什么特殊需求所在在此选择较为简单的方式--二进制安装包安装,二进制包安装的方法一般都是通过不同发行版本的Linux下的包管理器进行的,例如Debian和Ubuntu下是使用apt-get命令或aptitude命令来安装,命令如下: sudo apt-get insta

  • Postgresql开启远程访问的步骤全纪录

    前言 安装PostgreSQL数据库之后,默认是只接受本地访问连接.如果想在其他主机上访问PostgreSQL数据库服务器,就需要进行相应的配置.下面话不多说了,来一起看看详细的介绍吧. 步骤如下: 要在Postgresql中允许远程访问,需要设置如下2个文件: postgresql.conf pg_hba.conf 然而由于系统安装的是Centos 7,而默认的Postgresql版本为9.2,于是安装了个9.6的版本,却发现在配置好远程无法访问.而默认的路径是找不到上述2个文件的,此时可以通

  • Windows上PostgreSQL安装配置教程

    PostgreSQL的扩展PostGIS是最著名的开源GIS数据库. 安装PostgreSQL是第一步. 1.下载PostgreSQL的二进制安装文件. PostgreSQL官网–>Download–>Windows 64位,如图所示: (1)官网: https://www.postgresql.org/ (2)Download: https://www.postgresql.org/download/ https://www.postgresql.org/download/windows/

  • PostgreSQL安装、配置及简单使用方法

    一.PostgreSQL简介 1.什么是PostgreSQL PostgreSQL数据库是目前功能最强大的开源数据库,支持丰富的数据类型(如JSON何JSONB类型,数组类型)和自定义类型.而且它提供了丰富的接口,可以很容易地扩展它的功能,如可以在GiST框架下实现自己的索引类型等,它还支持使用C语言写自定义函数.触发器,也支持使用流行的语言写自定义函数,比如其中的PL/Perl提供了使用Perl语言写自定义函数的功能,当然还有PL/Python.PL/Tcl,等等. 2.PostgreSQL数

  • Postgresql备份和增量恢复方案

    前言 最近工作上使用的数据库一直是Postgresql,这是一款开源的数据库,而且任何个人可以将该数据库用于商业用途.在使用Postgresql的时候,让我最明显的感觉就是这数据库做的真心好,虽然说数据库的安装包真的很小,但是性能和操作的便捷是一点也不输给其他商业的大型数据库,另外在命令行界面下对该数据库直接进行操作的感觉真的是很爽.在使用数据库的时候,我们作为小公司的数据库管理员有一项工作是不可能避免的,那就是数据的备份和恢复问题.PostgreSQL虽然各个方面的有点很多,但是在数据库备份这

  • postgresql 按小时分表(含触发器)的实现方式

    本人后端开发,因为业务需求需要使用分表方式进行数据存储.结合网上的资料最后使用的以下方式: CREATE OR REPLACE FUNCTION auto_insert_into_tbl_partition() RETURNS trigger AS $BODY$ DECLARE time_column_name text ; -- 父表中用于分区的时间字段的名称[必须首先初始化!!] curMM varchar(16); -- 'YYYYMM'字串,用做分区子表的后缀 isExist boole

  • PostgreSQL教程(三):表的继承和分区表详解

    一.表的继承: 这个概念对于很多已经熟悉其他数据库编程的开发人员而言会多少有些陌生,然而它的实现方式和设计原理却是简单易懂,现在就让我们从一个简单的例子开始吧.     1. 第一个继承表:   复制代码 代码如下: CREATE TABLE cities (   --父表         name        text,         population float,         altitude     int     );     CREATE TABLE capitals (

  • 微信小程序 表单Form实例详解(附源码)

    微信小程序 表单Form实例 表单Form的应用很广泛,我们可以利用form设计登录注册,也可以设计一种答题问卷的形式,今天主要讲一下form的使用 form表单,将组件内输入的"switch","input","checkbox","slider","radio","picker"的值进行提交,数据的格式为:name:value,所以表单中控件都需要添加name属性,否则找不到对应控件

  • 浅谈PostgreSQL表分区的三种方式

    目录 一.简介 二.三种方式 2.1.Range范围分区 2.2.List列表分区 2.3.Hash哈希分区 三.总结 一.简介 表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案.一般建议当单表大小超过内存就可以考虑表分区了.PostgreSQL的表分区有三种方式: Range:范围分区: List:列表分区: Hash:哈希分区. 本文通过示例讲解如何进行这三种方式的分区. 二.三种方式 为方便,我们通过Docker的方式启动一个Postg

  • mysql清空表数据的两种方式和区别解析

    在MySQL中删除数据有两种方式: truncate(截短)属于粗暴型的清空 delete属于精细化的删除 删除操作 如果你需要清空表里的所有数据,下面两种均可: delete from tablename; truncate table tablename; 而如果你只是删除一部分数据,就只能使用delete: delete from tablename where case1 and case2; 区别 在精细化的删除部分数据时,只能使用delete. 而清空所有表数据时,两者均可,此时这两

  • 浅谈在js传递参数中含加号(+)的处理方式

    一般情况下,URL 中的参数应使用 url 编码规则,即把参数字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+). 但是对于带有中文的参数来说,这种编码会使编码后的字符串变得很长. 如果希望有短一点的方式对参数编码,可以采用 base64 编码方式对字符串进行编码,但是 base64 编码方式不能处理 JavaScript 中的中文,因为 JavaScript 中的中文都是以 UTF-16 方式保存的. 而 base64 只能处理单字

  • 表单元素值获取方式js及java方式的简单实例

    大家都知道我们在提交form的时候用了多种input表单.可是不是每一种input表单都是很简单的用Document.getElementById的方式就可以获取到的.有一些组合的form类似于checkbox或者radio或者select我们如何用javascript获取和在服务器中获取提交过来的参数呢? 多说无用.上代码: Jsp-html代码:  <form action="input.do" name="formkk"> <table>

  • sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期

    问题: 在数据库脚本开发中,有时需要生成一堆连续数字或者日期,例如yearly report就需要连续数字做年份,例如daily report就需要生成一定时间范围内的每一天日期. 而自带的系统表master..spt_values存在一定的局限性,只是从0到2047(验证脚本:select * from master..spt_values b where b.type = 'P'),也不能直接生成连续日期. 可能大部分人会想到一个笨办法,通过while循环去逐条插入数据到临时表,每次数字加1

  • django-xadmin根据当前登录用户动态设置表单字段默认值方式

    相信你一定会设置一个普通字段的默认值: class Offer(models.Model): salary = models.CharField(max_length=64, blank=True, default='6000', verbose_name='薪资待遇') 相信你还能动态设置外键字段的默认值: class Interview(models.Model): department = models.ForeignKey('departments.Department', relate

  • mysql表的四种分区方式总结

    目录 1.什么是表分区? 2.表分区与分表的区别 3.表分区有什么好处? 4.分区表的限制因素 5.如何判断当前MySQL是否支持分区? 6.MySQL支持的分区类型有哪些? 6.1.RANGE分区 6.1.1.根据数值范围 6.1.2.根据TIMESTAMP范围 6.1.3.根据DATE.DATETIME范围 6.1.4.根据多列范围 6.1.5.RANGE分区在如下场合特别有用 6.2.LIST分区 6.3.HASH分区 6.4.KEY分区 总结 1.什么是表分区? mysql数据库中的数据

随机推荐