postgresql 按小时分表(含触发器)的实现方式
本人后端开发,因为业务需求需要使用分表方式进行数据存储。结合网上的资料最后使用的以下方式:
CREATEORREPLACEFUNCTIONauto_insert_into_tbl_partition()
RETURNStriggerAS
$BODY$
DECLARE
time_column_nametext;--父表中用于分区的时间字段的名称[必须首先初始化!!]
curMMvarchar(16);--'YYYYMM'字串,用做分区子表的后缀
isExistboolean;--分区子表,是否已存在
strSQLtext;
BEGIN
--调用前,必须首先初始化(时间字段名):time_column_name[直接从调用参数中获取!!]
time_column_name:=TG_ARGV[0];
--判断对应分区表是否已经存在?
EXECUTE'SELECT$1.'||time_column_nameINTOstrSQLUSINGNEW;
curMM:=to_char(strSQL::timestamp,'YYYYMMDDHH');
selectcount(1)INTOisExistfrompg_classwhererelname=('t_audit_'||curMM);
--若不存在,则插入前需先创建子分区
IF(isExist=false)THEN
--创建子分区表
strSQL:='CREATETABLEIFNOTEXISTSt_audit_'||curMM||'()INHERITS(t_audit);';
EXECUTEstrSQL;
--创建索引
strSQL:='CREATEINDEXt_audit_'||curMM||'_INDEX_'||time_column_name||'ONt_audit_'||curMM||'('||time_column_name||');';
EXECUTEstrSQL;
ENDIF;
--插入数据到子分区!
strSQL:='INSERTINTOt_audit_'||curMM||'SELECT$1.*';
EXECUTEstrSQLUSINGNEW;
RETURNNULL;
END
$BODY$
LANGUAGEplpgsql;
我是按照小时对固定的一张表进行分表的,其实可以写活就是加个变量,拼sql的时候拼接进去。这个就是写个函数作为触发器的回调函数。就先判断一下这个表有没有,有就直接插,没有就建表再插。
CREATETRIGGERinsert_tbl_partition_trigger
BEFOREINSERT
ONt_audit
FOREACHROW
EXECUTEPROCEDUREauto_insert_into_tbl_partition('time');
建一个触发器,在父表的插入数据的时候执行前面的那个回调函数。
ps:下面看下postgresql表触发器
1、先建一个函数,用来执行触发器启动后要执行的脚本
CREATEORREPLACEFUNCTION"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'; IFNEW.aqi2、建表的触发器,
CREATETRIGGERgk_site_day_insertBEFOREINSERTONgk_site_day FOREACHROWEXECUTEPROCEDUREtrigger_day_aqi();总结
以上所述是小编给大家介绍的postgresql按小时分表(含触发器)的实现方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。