PostgreSQL 10 版本当往分区表写入的数据不在分区定义范围内时会报错,无法插入数据,PostgreSQL 11 版本分区表增加了 Default 分区用来存储不满足分区定义范围的数据。
本节以创建范围分区表为例进行测试。
PostgreSQL 10 版本
在PostgreSQL 10 版本进行测试,详见以下。
创建父表
create table tbl_log (
id serial,
create_time timestamp(0) without time zone,
remark char(1)
) PARTITION BY RANGE(create_time);
创建子表
CREATE TABLE tbl_log_p201801 PARTITION OF tbl_log FOR VALUES FROM ('2018-01-01') TO ('2018-02-01');
CREATE TABLE tbl_log_p201802 PARTITION OF tbl_log FOR VALUES FROM ('2018-02-01') TO ('2018-03-01');
插入测试
PostgreSQL 10 版本插入一条不在分区定义范围的记录,如下
mydb=> INSERT INTO tbl_log(id,create_time,remark) VALUES (3,'2018-03-01','a');
ERROR: no partition of relation "tbl_log" found for row
DETAIL: Partition key of the failing row contains (create_time) = (2018-03-01 00:00:00).
插入报错,提示找不到相应分区无法插入数据。
PostgreSQL 11 版本
PostgreSQL 11 版本支持创建 Default 分区,用来存储不满足分区定义的数据,测试如下。
创建父表
create table tbl_log (
id serial,
create_time timestamp(0) without time zone,
remark char(1)
) PARTITION BY RANGE(create_time);
创建常规分区
CREATE TABLE tbl_log_p201801 PARTITION OF tbl_log FOR VALUES FROM ('2018-01-01') TO ('2018-02-01');
CREATE TABLE tbl_log_p201802 PARTITION OF tbl_log FOR VALUES FROM ('2018-02-01') T