PostgreSQL12按主键分区搭建分片时创建外部分区报错求助
问题原因
PostgreSQL 目前不支持带全局唯一约束(如主键)的分区表创建外部分区:你在父表shardschema.department上定义的主键会自动生成全局唯一索引,而外部分区依赖的postgres_fdw无法跨远端分片节点完成全局唯一性校验,因此触发报错:
ERROR: cannot create foreign partition of partitioned table "department"
DETAIL: Table "department" contains indexes that are unique.
SQL state: 42809
可行解决方案
方案1:移除父表全局主键,将唯一性约束下放到各分区独立维护(推荐)
由于你的分区规则是按id范围划分,不同分区的id范围完全不重叠,只要每个分区单独维护id的唯一性,天然就能保证全局数据不会出现主键冲突,完全可以满足业务需求。
操作步骤如下:
- 先删除父表的全局主键约束
ALTER TABLE shardschema.department DROP CONSTRAINT department_pkey;
- 给已创建的本地分区单独添加主键约束
ALTER TABLE shardschema.department_210101 ADD CONSTRAINT department_210101_pkey PRIMARY KEY (id);
- 到对应远端分片节点(本例中是
shard_13对应的数据库实例)上,提前创建好对应外部分区的表结构并添加主键约束
-- 在shard_13节点执行 CREATE TABLE shardschema.department_210901 ( id int8, version integer, name varchar, age varchar, sal integer, CONSTRAINT department_210901_pkey PRIMARY KEY (id) );
- 回到当前节点重新执行外部分区创建语句即可成功
CREATE FOREIGN TABLE shardschema.department_210901 PARTITION OF shardschema.department FOR VALUES FROM ('2109010000000000000') TO('2112319999999999999') server shard_13;
方案2:放弃外部分区架构,全部分区使用本地分区
如果必须保留父表的全局主键约束,只能调整分片架构,不再使用外部分区,所有分区都创建在本地节点,该方案不满足跨节点分片的需求,仅作为备选。
内容的提问来源于stack exchange,提问作者rutuparna andhare
相关产品推荐
相关产品推荐

