PostgreSQL 10 版本虽然支持创建范围分区表和列表分区表,但创建过程依然比较繁琐,需要手工定义子表索引、主键,详见 PostgreSQL10:重量级新特性-支持分区表,PostgreSQL 11 版本得到增强,在父表上创建索引、主键、外键后,子表上将自动创建,本文演示这三种场景。
值得一提的是,11 版本之前 PostgreSQL 的分区表不支持全局主键,虽然可以在父表和子表上分别定义主键,但不支持全局主键,也就是说,父表和子表、子表和子表的主键数据可以重复。
手册上的 Release 说明
Support for PRIMARY KEY, FOREIGN KEY, indexes, and triggers on partitioned tables
本文以创建哈希分区表为例进行测试。
测试环境准备
创建分区表并插入测试数据,为后续测试做准备。
创建父表
CREATE TABLE userinfo (
userid int4,
username character varying(64),
ctime timestamp(6) without time zone
) PARTITION BY HASH(userid);
创建子表
CREATE TABLE userinfo_p0 PARTITION OF userinfo FOR VALUES WITH(MODULUS 4, REMAINDER 0);
CREATE TABLE userinfo_p1 PARTITION OF userinfo FOR VALUES WITH(MODULUS 4, REMAINDER 1);
CREATE TABLE userinfo_p2 PARTITION OF userinfo FOR VALUES WITH(MODULUS 4, REMAINDER 2);
CREATE TABLE userinfo_p3 PARTITION OF userinfo FOR VALUES WITH(MODULUS 4, REMAINDER 3);
插入数据
给分区表插入100万数据,如下:
INSERT INTO userinfo(userid,username,ctime) SELECT n, n || '_username',clock_timestamp() FROM generate_ser