如何在PostgreSQL 12分区表中添加主键且避免长时间锁表?
为PostgreSQL 12分区表添加主键并避免长时间锁表
我需要给PostgreSQL 12的分区表添加主键,同时避免长时间锁表。对于普通表,我可以先通过CONCURRENTLY创建唯一索引,再将该索引升级为主键,但对分区表执行此操作时会报错:
Query 1 ERROR: ERROR: ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables
我目前能想到的替代方案是不使用CONCURRENTLY,直接通过列创建主键:
ALTER TABLE table_name ADD PRIMARY KEY (col1, col2);
但这个操作会锁表,所以想问问有没有其他方法。
尝试过的操作及报错
我尝试过以下SQL操作,但依然触发相同报错:
-- 创建无效的父索引 CREATE UNIQUE INDEX main_iex ON ONLY table_name (uuid, accessed); -- 为每个分区创建并发唯一索引 CREATE UNIQUE INDEX CONCURRENTLY part1_idx ON part1 (uuid, accessed); CREATE UNIQUE INDEX CONCURRENTLY part2_idx ON part2 (uuid, accessed); ... -- 将分区索引关联到父索引 ALTER INDEX main_idx ATTACH PARTITION part1_idx; ALTER INDEX main_idx ATTACH PARTITION part2_idx; ... -- 尝试通过已关联的父索引创建主键 ALTER TABLE request_log ADD PRIMARY KEY USING INDEX request_log_uuid_accessed_idx;
执行结果报错:
Query 1 ERROR: ERROR: ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables
可行解决方案
采纳建议后,找到一种仅会对分区表造成极短时间锁表的方案:
-- 逐个为每个分区执行以下步骤: CREATE UNIQUE INDEX CONCURRENTLY part1_idx ON part1 (uuid, accessed); ALTER TABLE part1 ADD PRIMARY KEY USING INDEX part1_idx; CREATE UNIQUE INDEX CONCURRENTLY part2_idx ON part2 (uuid, accessed); ALTER TABLE part2 ADD PRIMARY KEY USING INDEX part2_idx; ... -- 所有分区主键创建完成后,为分区表创建主键(此操作速度极快) ALTER TABLE table ADD PRIMARY KEY (uuid, accessed);
内容的提问来源于stack exchange,提问作者Alechko
相关产品推荐
相关产品推荐

