postgres分区表的创建-基于继承

这篇具有很好参考价值的文章主要介绍了postgres分区表的创建-基于继承。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考文档:
http://postgres.cn/docs/12/ddl-partitioning.html

创建基于继承的分区表的步骤
1 创建父表
2 创建子表,从父表继承过来
3 创建函数及触发器,使插入的数据根据规则,插入到对应的子表中 

-- 创建父表

CREATE TABLE apps.measurement (
    city_id         int not null,
    logdate         date not null,
    peaktemp        int,
    unitsales       int
);


test=# CREATE TABLE apps.measurement (
test(#     city_id         int not null,
test(#     logdate         date not null,
test(#     peaktemp        int,
test(#     unitsales       int
test(# );
CREATE TABLE
test=# 

-- 创建分区表,5个分区 

CREATE TABLE apps.measurement_y2023m01 (CHECK ( logdate >= DATE '2023-01-01' AND logdate < DATE '2023-02-01' )) INHERITS (measurement);
CREATE TABLE apps.measurement_y2023m02 (CHECK ( logdate >= DATE '2023-02-01' AND logdate < DATE '2023-03-01' )) INHERITS (measurement);
CREATE TABLE apps.measurement_y2023m03 (CHECK ( logdate >= DATE '2023-03-01' AND logdate < DATE '2023-04-01' )) INHERITS (measurement);
CREATE TABLE apps.measurement_y2023m04 (CHECK ( logdate >= DATE '2023-04-01' AND logdate < DATE '2023-05-01' )) INHERITS (measurement);
CREATE TABLE apps.measurement_y2023m05 (CHECK ( logdate >= DATE '2023-05-01' AND logdate < DATE '2023-06-01' )) INHERITS (measurement);

test=# CREATE TABLE apps.measurement_y2023m01 (CHECK ( logdate >= DATE '2023-01-01' AND logdate < DATE '2023-02-01' )) INHERITS (measurement);
CREATE TABLE
test=# CREATE TABLE apps.measurement_y2023m02 (CHECK ( logdate >= DATE '2023-02-01' AND logdate < DATE '2023-03-01' )) INHERITS (measurement);
CREATE TABLE
test=# CREATE TABLE apps.measurement_y2023m03 (CHECK ( logdate >= DATE '2023-03-01' AND logdate < DATE '2023-04-01' )) INHERITS (measurement);
CREATE TABLE
test=# CREATE TABLE apps.measurement_y2023m04 (CHECK ( logdate >= DATE '2023-04-01' AND logdate < DATE '2023-05-01' )) INHERITS (measurement);
CREATE TABLE
test=# CREATE TABLE apps.measurement_y2023m05 (CHECK ( logdate >= DATE '2023-05-01' AND logdate < DATE '2023-06-01' )) INHERITS (measurement);
CREATE TABLE
test=# 

-- 创建触发器函数,针对不同月份的数据,落入不同的子表,从而达到数据分区的效果

CREATE OR REPLACE FUNCTION apps.measurement_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
      IF (NEW.logdate >= DATE '2023-01-01' AND  
	      NEW.logdate < DATE '2023-02-01') THEN 
	      INSERT INTO apps.measurement_y2023m01 values (NEW.*);
	  
	  ELSIF (NEW.logdate >= DATE '2023-02-01' AND  
	         NEW.logdate < DATE '2023-03-01') THEN 
	         INSERT INTO apps.measurement_y2023m02 values (NEW.*);
	  
	  ELSIF (NEW.logdate >= DATE '2023-03-01' AND  
	         NEW.logdate < DATE '2023-04-01') THEN 
	         INSERT INTO apps.measurement_y2023m03 values (NEW.*);
	  
	  ELSIF (NEW.logdate >= DATE '2023-04-01' AND  
	         NEW.logdate < DATE '2023-05-01') THEN 
	        INSERT INTO apps.measurement_y2023m04 values (NEW.*);
	  
	  ELSIF (NEW.logdate >= DATE '2023-05-01' AND  
	         NEW.logdate < DATE '2023-06-01') THEN 
	         INSERT INTO apps.measurement_y2023m05 values (NEW.*);	  
	  ELSE 
	      RAISE EXCEPTION 'Date out of range .Fix the apps.measurement_insert_trigger() function!';
	  END IF;
	  RETURN NULL;
END;
$$
LANGUAGE plpgsql;

test=# CREATE OR REPLACE FUNCTION apps.measurement_insert_trigger()
test-# RETURNS TRIGGER AS $$
test$# BEGIN
test$#       IF (NEW.logdate >= DATE '2023-01-01' AND  NEW.logdate < DATE '2023-02-01') THEN 
test$#   INSERT INTO apps.measurement_y2023m01 values (NEW.*);
test$#   
test$#   ELSE IF (NEW.logdate >= DATE '2023-02-01' AND  NEW.logdate < DATE '2023-03-01') THEN 
test$#   INSERT INTO apps.measurement_y2023m02 values (NEW.*);
test$#   
test$#   ELSE IF (NEW.logdate >= DATE '2023-03-01' AND  NEW.logdate < DATE '2023-04-01') THEN 
test$#   INSERT INTO apps.measurement_y2023m03 values (NEW.*);
test$#   
test$#   ELSE IF (NEW.logdate >= DATE '2023-04-01' AND  NEW.logdate < DATE '2023-05-01') THEN 
test$#   INSERT INTO apps.measurement_y2023m04 values (NEW.*);
test$#   
test$#   ELSE IF (NEW.logdate >= DATE '2023-05-01' AND  NEW.logdate < DATE '2023-06-01') THEN 
test$#   INSERT INTO apps.measurement_y2023m05 values (NEW.*);
test$#   
test$#   ELSE 
test$#       RAISE EXCEPTION 'Date out of range .Fix the apps.measurement_insert_trigger() function! ';
test$#   END IF;
test$#   RETURN NULL;
test$# END;
test$# $$
test-# LANGUAGE plpgsql;
CREATE FUNCTION
test=# 

-- 创建触发器  ,不带schema,创建的触发器,默认就在apps的schema中

CREATE TRIGGER APPS.INSERT_MEASUREMENT_TRIGGER       <<<<<< 奇怪,触发器带schema,创建的时候报错 ,
    BEFORE INSERT ON APPS.MEASUREMENT
    FOR EACH ROW EXECUTE FUNCTION APPS.MEASUREMENT_INSERT_TRIGGER();
	
CREATE or replace  TRIGGER INSERT_MEASUREMENT_TRIGGER
    BEFORE INSERT ON APPS.MEASUREMENT
    FOR EACH ROW EXECUTE FUNCTION APPS.MEASUREMENT_INSERT_TRIGGER();	

test=# CREATE TRIGGER APPS.INSERT_MEASUREMENT_TRIGGER
test-#     BEFORE INSERT ON APPS.MEASUREMENT
test-#     FOR EACH ROW EXECUTE FUNCTION APPS.MEASUREMENT_INSERT_TRIGGER();
ERROR:  syntax error at or near "."
LINE 1: CREATE TRIGGER APPS.INSERT_MEASUREMENT_TRIGGER
                           ^
test=# CREATE or replace  TRIGGER INSERT_MEASUREMENT_TRIGGER
test-#     BEFORE INSERT ON APPS.MEASUREMENT
test-#     FOR EACH ROW EXECUTE FUNCTION APPS.MEASUREMENT_INSERT_TRIGGER();
CREATE TRIGGER
test=# 

-- 插入数据

CREATE TABLE apps.measurement (
    city_id         int not null,
    logdate         date not null,
    peaktemp        int,
    unitsales       int
);

insert into apps.measurement values (1,date '2023-01-02',2,2);
insert into apps.measurement values (2,date '2023-02-02',2,2);	
insert into apps.measurement values (3,date '2023-03-02',2,2);	
insert into apps.measurement values (4,date '2023-04-02',2,2);	
insert into apps.measurement values (5,date '2023-05-02',2,2);	



test=# insert into apps.measurement values (1,date '2023-01-02',2,2);
INSERT 0 0
test=# insert into apps.measurement values (2,date '2023-02-02',2,2);
INSERT 0 0
test=# insert into apps.measurement values (3,date '2023-03-02',2,2);
INSERT 0 0
test=# insert into apps.measurement values (4,date '2023-04-02',2,2);
INSERT 0 0
test=# insert into apps.measurement values (5,date '2023-05-02',2,2);
INSERT 0 0
test=# 

-- 查看父表和各个分区表的数据 ,可以看到1个父表,5个分区表

test=# \d
                List of relations
 Schema |         Name         | Type  |  Owner   
--------+----------------------+-------+----------
 apps   | measurement          | table | postgres
 apps   | measurement_y2023m01 | table | postgres
 apps   | measurement_y2023m02 | table | postgres
 apps   | measurement_y2023m03 | table | postgres
 apps   | measurement_y2023m04 | table | postgres
 apps   | measurement_y2023m05 | table | postgres
 apps   | persons              | table | postgres
 apps   | students             | table | postgres
 apps   | t1                   | table | postgres
(9 rows)

test=# 


test=# select * from measurement;
 city_id |  logdate   | peaktemp | unitsales 
---------+------------+----------+-----------
       1 | 2023-01-02 |        2 |         2
       2 | 2023-02-02 |        2 |         2
       3 | 2023-03-02 |        2 |         2
       4 | 2023-04-02 |        2 |         2
       5 | 2023-05-02 |        2 |         2
(5 rows)

test=# 

test=# select * from measurement_y2023m01;
 city_id |  logdate   | peaktemp | unitsales 
---------+------------+----------+-----------
       1 | 2023-01-02 |        2 |         2
(1 row)

test=# select * from measurement_y2023m02;
 city_id |  logdate   | peaktemp | unitsales 
---------+------------+----------+-----------
       2 | 2023-02-02 |        2 |         2
(1 row)

test=# select * from measurement_y2023m03;
 city_id |  logdate   | peaktemp | unitsales 
---------+------------+----------+-----------
       3 | 2023-03-02 |        2 |         2
(1 row)

test=# select * from measurement_y2023m04;
 city_id |  logdate   | peaktemp | unitsales 
---------+------------+----------+-----------
       4 | 2023-04-02 |        2 |         2
(1 row)

test=# select * from measurement_y2023m05;
 city_id |  logdate   | peaktemp | unitsales 
---------+------------+----------+-----------
       5 | 2023-05-02 |        2 |         2
(1 row)

test=# 

-- 插入2023年6月份的数据 ,直接报错 ,因为此时没有创建6月份的子表,触发器函数中也没有处理6月份数据的规则

insert into apps.measurement values (1,date '2023-06-02',2,2);
test=# insert into apps.measurement values (1,date '2023-06-02',2,2);
ERROR:  Date out of range .Fix the apps.measurement_insert_trigger() function!
CONTEXT:  PL/pgSQL function measurement_insert_trigger() line 23 at RAISE
test=# 

-- 创建6月份分区表,

修改触发器函数。使6月份的数据可以插入进去

CREATE TABLE apps.measurement_y2023m06 (CHECK ( logdate >= DATE '2023-06-01' AND logdate < DATE '2023-07-01' )) INHERITS (measurement);

CREATE OR REPLACE FUNCTION apps.measurement_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
      IF (NEW.logdate >= DATE '2023-01-01' AND  
	      NEW.logdate < DATE '2023-02-01') THEN 
	      INSERT INTO apps.measurement_y2023m01 values (NEW.*);
	  
	  ELSIF (NEW.logdate >= DATE '2023-02-01' AND  
	         NEW.logdate < DATE '2023-03-01') THEN 
	         INSERT INTO apps.measurement_y2023m02 values (NEW.*);
	  
	  ELSIF (NEW.logdate >= DATE '2023-03-01' AND  
	         NEW.logdate < DATE '2023-04-01') THEN 
	         INSERT INTO apps.measurement_y2023m03 values (NEW.*);
	  
	  ELSIF (NEW.logdate >= DATE '2023-04-01' AND  
	         NEW.logdate < DATE '2023-05-01') THEN 
	        INSERT INTO apps.measurement_y2023m04 values (NEW.*);
	  
	  ELSIF (NEW.logdate >= DATE '2023-05-01' AND  
	         NEW.logdate < DATE '2023-06-01') THEN 
	         INSERT INTO apps.measurement_y2023m05 values (NEW.*);	  
			 	 
	  ELSIF (NEW.logdate >= DATE '2023-06-01' AND                             <<<<<<<  新加入的规则
	         NEW.logdate < DATE '2023-07-01') THEN 
	         INSERT INTO apps.measurement_y2023m06 values (NEW.*);
			 
	  ELSE 
	      RAISE EXCEPTION 'Date out of range .Fix the apps.measurement_insert_trigger() function!';
	  END IF;
	  RETURN NULL;
END;
$$
LANGUAGE plpgsql;
test=# insert into apps.measurement values (1,date '2023-06-02',2,2);       <<<<<< 插入6月份数据 
INSERT 0 0
test=# select * from measurement_y2023m06;                                  <<<<<<  查询分区数据 
 city_id |  logdate   | peaktemp | unitsales 
---------+------------+----------+-----------
       1 | 2023-06-02 |        2 |         2
(1 row)

test=# 

-- 通过视图查看分区表,查询不到基于继承建立的分区表

test=# select * from pg_partitioned_table ;
 partrelid | partstrat | partnatts | partdefid | partattrs | partclass | partcollation | partexprs 
-----------+-----------+-----------+-----------+-----------+-----------+---------------+-----------
(0 rows)

test=# 

--通过dt+ 命令查看建立的父表和子表

test=# \dt+ apps.measurement*
                                             List of relations
 Schema |         Name         | Type  |  Owner   | Persistence | Access method |    Size    | Description 
--------+----------------------+-------+----------+-------------+---------------+------------+-------------
 apps   | measurement          | table | postgres | permanent   | heap          | 0 bytes    | 
 apps   | measurement_y2023m01 | table | postgres | permanent   | heap          | 8192 bytes | 
 apps   | measurement_y2023m02 | table | postgres | permanent   | heap          | 8192 bytes | 
 apps   | measurement_y2023m03 | table | postgres | permanent   | heap          | 8192 bytes | 
 apps   | measurement_y2023m04 | table | postgres | permanent   | heap          | 8192 bytes | 
 apps   | measurement_y2023m05 | table | postgres | permanent   | heap          | 8192 bytes | 
 apps   | measurement_y2023m06 | table | postgres | permanent   | heap          | 8192 bytes | 
(7 rows)

test=# 

END文章来源地址https://www.toymoban.com/news/detail-406903.html

到了这里,关于postgres分区表的创建-基于继承的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • oracle分区表创建(自动按年、月、日分区)实战

    前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性。 oracle 11g 支持自动分区,不过得在创建表时就设置好分区。 如果已经存在的表需要改分区表,就需要将

    2024年02月02日
    浏览(32)
  • PostgreSQL按日期列创建分区表

          在PostgreSQL中,实现自动创建分区表主要依赖于表的分区功能,这一功能从PostgreSQL 10开始引入。分区表可以帮助管理大量数据,通过分布数据到不同的分区来提高查询效率和数据维护的便捷性。以下是在PostgreSQL中自动创建分区表的一般步骤: 首先,你需要创建一个父表

    2024年02月21日
    浏览(33)
  • Hive创建分区表并插入数据

    业务中经常会遇到这种需求:数据每天全量更新,但是要求月底将数据单独保存一份以供后期查询某月节点的信息。这时就要考虑用到Hive的分区表实现,即按照月份创建分区表,相当于新的月份数据保存在新表,进而实现保存了历史数据。 分区表的创建本质是在HDFS创建了一

    2024年02月07日
    浏览(37)
  • Hive创建分区表时提示错误,java面试线程池

    at org.apache.hadoop.hive.ql.parse.HiveParser.alterTableStatementSuffix(HiveParser.java:7971) at org.apache.hadoop.hive.ql.parse.HiveParser.alterStatement(HiveParser.java:7447) at org.apache.hadoop.hive.ql.parse.HiveParser.ddlStatement(HiveParser.java:4337) at org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:2494) at org.apache.hadoop

    2024年04月10日
    浏览(39)
  • Iceberg从入门到精通系列之五:Zeppelin集成iceberg,创建iceberg普通表和分区表,并插入数据

    Zeppelin支持Flink SQL Flink SQL支持iceberg Zeppelin集成Flink SQL后,就可以在Zeppelin上创建iceberg表了 下面演示下Zeppelin集成iceberg后,创建表,插入数据的方便性。

    2024年02月11日
    浏览(38)
  • 【mysql表分区系】mysql创建分区表提示A PRIMARY KEY must include all columns in the table‘s partitioning function

    首先声明下我这边使用的mysql版本是5.7.29版本,当然下面的问题我这边也是基于这个版本。这里因为没有考证其他版本是否也会有这些问题,可自行官方文档来查阅资料 一个唯一键必须包含表分区函数所有的列,根据这个错误提示我们大概就知道怎么处理,但是why?我们还是沉

    2024年02月06日
    浏览(78)
  • mysql分区表:日期分区

    1.创建分区表 2.查看分区 3.添加分区 4.存储过程:分区删除与创建 5.事件定时 6.触发器设计:子表每插入一行,总表获得一行 7.创建索引 8.添加枚举型字段

    2024年02月16日
    浏览(36)
  • hive分区表 静态分区和动态分区

    现有数据文件 data_file 如下: 2023-08-01,Product A,100.0 2023-08-05,Product B,150.0 2023-08-10,Product A,200.0 需要手动指定分区 现有源数据表如下: CREATE TABLE sales_source (     sale_date STRING,     product STRING,     amount DOUBLE ); INSERT INTO sales_source VALUES     (\\\'2023-08-01\\\', \\\'Product A\\\', 100.0),     (\\\'2023-08-

    2024年02月10日
    浏览(40)
  • Hive分区表实战 - 多分区字段

    本实战教程通过一系列Hive SQL操作,演示了如何在大数据环境下创建具有省市分区的大学表,并从本地文件系统加载不同地区的学校数据到对应分区。首先,创建名为 school 的数据库并切换至该数据库;接着,在数据库中定义一个名为 university 的分区表,其结构包括ID和名称两

    2024年01月15日
    浏览(37)
  • mysql分区表 -列表分区(list prtition)

    示例,创建一张员工表按照employee_id进行列表分区: 查询0号分区: select * from employees partition(p0); select * from employees partition(p1); select * from employees partition(p0,p1); 和range分区一样,可以使用alter table … add/drop partition新增/删除分区: ALTER TABLE employees ADD PARTITION(PARTITION p2 VALUES IN

    2024年02月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包