You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:05:12