创建PostgreSQL分区后插入数据报错:无对应分区(ymd=20190902)
创建PostgreSQL分区后插入数据报错
SQL Error [23514]: ERROR: 关系"data_part"无对应此行的分区 详情:失败行的分区键值:(ymd) = (20190902)
问题分析
核心原因是PostgreSQL范围分区遵循左闭右开规则:FOR VALUES FROM (a) TO (b)的区间包含a但不包含b。你创建的第一个分区data_part_201909_1范围是('20190901') TO ('20190902'),仅能容纳20190901的数据,20190902不在任何已定义的分区范围内,因此插入时触发报错。
解决办法
调整分区区间(推荐方案)
修改分区的上下限,让区间连续覆盖所有可能的ymd值:
-- 若原分区未插入数据,先删除错误分区 DROP TABLE data_part_201909_1; -- 创建覆盖20190901-20190902的分区 CREATE TABLE data_part_201909_1 PARTITION OF data_part FOR VALUES FROM ('20190901') TO ('20190903') TABLESPACE pg_default; -- 调整后续分区起始值,保证区间连续 CREATE TABLE data_part_201909_2 PARTITION OF data_part FOR VALUES FROM ('20190903') TO ('20190905') TABLESPACE pg_default; -- 月末分区用下月第一天作为上限,避免遗漏月末数据 CREATE TABLE data_part_201909_3 PARTITION OF data_part FOR VALUES FROM ('20190905') TO ('20191001') TABLESPACE pg_default;
关于继承表方式的补充说明
你用INHERITS创建的是PostgreSQL早期的继承式分区,这种方式需要手动编写触发器实现数据自动路由,否则直接插入父表measurement的数据不会自动分发到子表,甚至可能导致数据冗余。现代PostgreSQL更推荐使用你第一次尝试的声明式分区(PARTITION BY语法),它内置数据路由逻辑,无需手动维护触发器。
内容的提问来源于stack exchange,提问作者chanhoo
相关产品推荐
相关产品推荐

