如何在PostgreSQL中将现有索引提升为主键


13

我知道如何在表中创建主键,但是如何使现有索引成为主键?我正在尝试将现有表从一个数据库复制到另一个数据库。当我显示表格时,底部的索引采用以下形式:

"my_index" PRIMARY KEY, btree (column1, column2)

我用以下方法创建了索引:

CREATE INDEX my_index ON my_table (column1, column2)

但我不知道如何使其成为主键...

更新:我的服务器版本是8.3.3


1
如果my_index显示为主键的名称,则您已经一个索引。Postgres中没有(唯一)索引就没有PK
a_horse_with_no_name 2011年

1
您的PostgreSQL版本是什么?
filiprem 2011年

我正在运行8.3.3
WildBill,2011年

Answers:


16

您将使用ALTER TABLE添加主键约束。在Postgres中,您可以使用“ ALTER TABLE .. ADD table_constraint_using_index”表单“提升”索引

注意,索引对于主键当然必须是唯一的

ALTER TABLE my_table 
    ADD CONSTRAINT PK_my_table PRIMARY KEY USING INDEX my_index;

那对我没有用。什么是PK_my_table?我假设这是一个标签,并且在表名后面附加了“ PK_”?我收到一个语法错误,提示“错误:字符83处“使用中”或附近的语法错误”
WildBill 2011年

1
@ngramsky: USING INDEX从9.1开始可用。因此,我想您不是正在运行当前版本
a_horse_with_no_name 2011年

不,我正在使用8.3.3,如何在8.3.3中执行此操作?
WildBill 2011年

5
在那个古老版本中,唯一的方法是删除索引并添加新的pk约束。
a_horse_with_no_name 2011年

2
@a_horse_with_no_name:您应该做出一个答案:您的评论要早于其他答案……
gbn

7

我认为在该版本的PostgreSQL中将索引转换为主键是不可能的。

我将删除现有索引并使用您指定的列创建主键:

DROP INDEX my_index;
ALTER TABLE ONLY my_table ADD CONSTRAINT pk_my_table PRIMARY KEY(column1,column2);

在7.4和8.4工作


btw,“如果在表名之前指定了ONLY,则仅更改该表。如果未指定ONLY,则将更改该表及其所有后代表(如果有)。”
Paolo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.