删除主键而不删除索引

xch*_*chg 5 postgresql index primary-key ddl

是否可以在不删除索引的情况下删除表上的主键约束?我有一种情况,我想删除PRIMARY KEY以摆脱NOT NULL约束并将其设置为另一个列对。我想避免删除和重新创建索引。可以只PRIMARY KEY删除索引上的“属性”吗?删除约束会删除索引。

我使用的是 PostgreSQL 9.1 版。

Erw*_*ter 5

我认为没有支持的方法来做到这一点。考虑到目前为止的评论。

如果您担心对并发事务的影响,手册中有一个代码示例

要重新创建主键约束,而不在重建索引时阻止更新:

CREATE UNIQUE INDEX CONCURRENTLY dist_id_temp_idx ON distributors (dist_id);
ALTER TABLE distributors DROP CONSTRAINT distributors_pkey,
    ADD CONSTRAINT distributors_pkey PRIMARY KEY USING INDEX dist_id_temp_idx;
Run Code Online (Sandbox Code Playgroud)

对于您的情况,您可以创建 PK 第二次使用的相同索引 新 PK 使用的索引。然后像示例中那样删除 PK,添加一个基于新索引的不同(与示例不同)PK 和一个UNIQUE基于重复的前 PK 索引的新约束。全部在一个声明中。那只会锁定表一毫秒。
三个单独的命令(不在一个事务中):

CREATE UNIQUE INDEX CONCURRENTLY dupe_of_old_pk_idx ON tbl (old_pk_id);
CREATE UNIQUE INDEX CONCURRENTLY new_pk_idx ON tbl (new_pk_id1, new_pk_id2);

ALTER TABLE tbl
   DROP CONSTRAINT tbl_pkey
 , ADD  CONSTRAINT tbl_uni  UNIQUE USING INDEX dupe_of_old_pk_idx
 , ADD  CONSTRAINT tbl_pkey PRIMARY KEY USING INDEX new_pk_temp_idx;
Run Code Online (Sandbox Code Playgroud)