欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-22 14:41:02
本人后端开发,因为业务需求需要使用分表方式进行数据存储。结合网上的资料最后使用的以下方式: create or replace function auto_insert_in...

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

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 按小时分表(含触发器)的实现方式,希望对大家有所帮助