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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。