博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSql Partition + Hibernate Insert
阅读量:6585 次
发布时间:2019-06-24

本文共 1868 字,大约阅读时间需要 6 分钟。

与Oracle不同。PostgreSQL须要手动控制分区规则触发器。

步骤一:创建分区

CREATE TABLE table_partition_1( CHECK partition_column criteria) INHENRITS (table)

步骤二:为分区表创建PK跟index,这里使用btree
ALTER TABLE ONLY table_partition_1 ADD CONSTRAINT table_partition_1_pkey PRIMARY KEY (key_column);
CREATE INDEX index_table_partition_1 ON table_partition_1  USING btree(column);
步骤三:手动创建触发器
CREATE OR REPLACE FUNCTION before_insert_table()  RETURNS trigger AS$BODY$ DECLARE  BEGINif criteria  then	EXECUTE 'insert into appropriate table ...'  SELECT  ($1).* '  USING NEW;end if;return null;END;$BODY$  LANGUAGE plpgsql VOLATILE  COST 100;ALTER FUNCTION before_insert_table()  OWNER TO db;
rule在批量操作时更合适,可是对于单独操作会占用较大的开销。

CREATE RULE table_partition_1 _insert AS(criteria ...)DO INSTEAD     INSERT INTO table_partition_1 VALUES (NEW.*)
步骤四:触发器方式hibernate向分区插入数据时。获得的result count为0,会导致推断失败而回滚。

解决方法是使用rule,或者声明分区插入时不进行result检查。
@SQLInsert(sql = "INSERT INTO "		+ "table(column,...)"		+ " VALUES(?,...)", check = ResultCheckStyle.NONE)
在Java项目中。考虑到分区创建会採用job方式自己主动创建,能够通过function完毕创建。

CREATE OR REPLACE FUNCTION "public"."function"()  RETURNS void AS $BODY$  DECLARE   	 _tablename text ;   quarter integer;	record1 record;  BEGIN	select function(now()) as quarter  into record1;  quarter := record1.quarter;	_tablename := 'partition_name';PERFORM 1FROM   pg_catalog.pg_class cWHERE  c.relname = _tablename;	IF FOUND <> TRUE THEN			EXECUTE 'CREATE TABLE ' || _tablename  || ' (        CHECK ( criteria)      ) INHERITS (table)';		EXECUTE 'ALTER TABLE ' || _tablename  || ' OWNER TO db ';		EXECUTE  ' alter table ' ||   _tablename || ' add CONSTRAINT  ' || _tablename||'_pkey  PRIMARY key (column) ' ;		EXECUTE  ' CREATE INDEX ' || _tablename|| '_index		ON '||  _tablename ||'		USING btree		(column)';   END IF;END$BODY$  LANGUAGE 'plpgsql' VOLATILE COST 100;ALTER FUNCTION "public"."function"() OWNER TO "db";
參考资料:

转载地址:http://opxno.baihongyu.com/

你可能感兴趣的文章
Python PyPI中国镜像
查看>>
centos 设置静态IP
查看>>
[Angularjs]系列——学习与实践
查看>>
js -- canvas img 封装
查看>>
适配器模式(数据库方面)支持不同的数据库连接
查看>>
CF456B Fedya and Maths 找规律
查看>>
转载:Beginning WF 4.0翻译——第三章(流程图工作流)
查看>>
mysql alter table
查看>>
芯片测试
查看>>
在源代码中插入防止盗版代码片段的方式
查看>>
ffserver联合ffmpeg建立媒体服务器
查看>>
微软URLRewriter.dll的url重写的简单使用(实现伪静态)
查看>>
leetcode -- Combination Sum II
查看>>
PIN码计算锦集
查看>>
[Unity3D]再次点击以退出程序
查看>>
架构师的97种习惯
查看>>
PHP 开发 APP 接口 学习笔记与总结 - XML 方式封装通信接口
查看>>
IT基础架构规划方案之实际网络设计案例
查看>>
Navicat for MySQL 使用SSH方式链接远程数据库(二)
查看>>
poj 1274The Perfect Stall
查看>>