本人后端开发,因为业务需求需要使用分表方式进行数据存储。结合网上的资料最后使用的以下方式:
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 按小时分表(含触发器)的实现方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
PostgreSQL 触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。 下面是关于 PostgreSQL 触发器几个比较重要的点: PostgreSQL 触发器可以在下面几种情况下触发: 在执行操作之前(在检查约束并尝试插入、更新或删除之前)。 在执行操作之后(在检查约束并插入、更新或删除完成之后)。 更新操作(在对一个视图进行插入、更新、删除时)。 触发器的 FOR EAC
我有一个jdbc客户机与postgresql数据库通信。从JDBC中创建一条准备好的语句,用于在表中插入一些数据,但在创建查询时,客户机不知道要在语句中插入的所有字段,为了完成查询,我编写了一个触发器,在该表上插入之前触发,找到缺少的值,继续执行查询。这是jdbc代码: 这是触发代码: 当触发器触发时,我有一个错误: 这是什么意思?记录新的,正如你在jdbc代码中看到的那样。。。
本文向大家介绍javascript实现方法调用与方法触发小结,包括了javascript实现方法调用与方法触发小结的使用技巧和注意事项,需要的朋友参考一下 在js中,this关键字是一个比较让人有意思的东西,但是它的指向经常让初学者摸不着头脑。 其实要理解这个关键字,需要理清两个问题——“方法的调用和方法的触发” 下面先看一段代码 20行打印出window对象,这个很容易理解,但是21
问题内容: 我在PostgreSQL中有一些存储的函数和触发器。例如: 并触发: 我想在每次部署后导入此代码。(我有) 我认为对于函数来说这是不可能的,因为它具有plpgsql,但是对于触发器来说则是很棒的。我一直在尝试将触发器添加到import.sql,但是我已经 而且我不想将此代码移至Java级别。 有任何想法吗? 问题答案: 创建一个EJB,并在调用该方法的方法时调用所需的过程。您不能直接从
本文向大家介绍jquery实现触发时更新下拉列表内容的方法,包括了jquery实现触发时更新下拉列表内容的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jquery实现触发时更新下拉列表内容的方法。分享给大家供大家参考,具体如下: 服务端假如有个请求地址用来返回所需数据 url:/hello 返回类似: 这样的json数据 html: 按钮:<input type="button"
我有一个dynamoDb表,它设置为两个区域之间的全局(2019版)。 我在表上分配了一个lambda函数作为触发器。当一条记录插入到表的东版本中时,就会触发lambda的东版本。然后将记录复制到表的西版本,并触发lambda的西版本。 我想要一个λ触发。但是我也希望两个触发器都启用,以防一个区域出现故障。 我怎样才能做到这一点?我宁愿不使触发器逻辑幂等。