在PostgreSQL中删除索引的唯一性


71

在我的PostgreSQL数据库中,我以这种方式创建了一个唯一索引:

CREATE UNIQUE INDEX <my_index> ON <my_table> USING btree (my_column)

有没有办法更改索引以消除唯一约束?我查看了ALTER INDEX文档,但它似乎没有满足我的需求。

我知道我可以删除索引并创建另一个索引,但是我想找到一种更好的方法(如果存在)。

Answers:


107

您可能可以删除唯一的CONSTRAINT,而不是其INDEX本身。

检查您的CONSTRAINTS通行证select * from information_schema.table_constraints;

然后,如果找到一个,则应该可以将其删除:

ALTER TABLE <my_table> DROP CONSTRAINT <constraint_name>

编辑:此问题中描述了一个相关的问题


2
谢谢你的建议。不幸的是,没有这样的限制。
谢尔盖·波塔波夫

1
是的,我也想到了这一点,但在Postgres中对其进行了检查...添加唯一索引不会对表添加约束...它似乎是索引本身的一部分。
dcsohl

1
@dcsohl是的。这很有趣,我调查了一下,根据这个问题,唯一的约束可以创建索引(但不是相反)

2
@SergeyPotapov此答案不能解决您的问题带来的问题。您可以重温这个问题并选择正确的答案吗?
vallismortis

36

假设您具有以下条件:

Indexes:
    "feature_pkey" PRIMARY KEY, btree (id, f_id)
    "feature_unique" UNIQUE, btree (feature, f_class)
    "feature_constraint" UNIQUE CONSTRAINT, btree (feature, f_class)

要删除UNIQUE CONSTRAINT,可以使用ALTER TABLE

ALTER TABLE feature DROP CONSTRAINT feature_constraint;

要删除PRIMARY KEY,您还可以使用ALTER TABLE

ALTER TABLE feature DROP CONSTRAINT feature_pkey;

要删除UNIQUE [index],可以使用DROP INDEX

DROP INDEX feature_unique;

5
为什么官方文档中不能包含这样的示例
Akash Singh,

1
谢谢。这是正确的答案!
MichalKrča20年

6

我认为这是不可能的...即使在pgAdmin III UI中,如果您尝试编辑使用语句创建的约束,则“唯一”框将显示为灰色。您无法通过用户界面进行更改。结合您对ALTER INDEX文档的研究,我认为这是不可能完成的。


0

在相同的问题上搜索了几个小时,似乎没有得到正确的答案-所有给定的答案都无法正常工作。

对于非空值,我还花了一些时间来查找。显然由于某些原因,多数认证代码在我使用时不起作用。

我得到的不是非null版本代码,像这样

ALTER TABLE tablename
ALTER COLUMN column_want_to_remove_constriant
DROP NOT NULL

可悲的是将“ not null”更改为“ unique”无效。


1
这似乎与要求更改索引的问题无关。
GreenTurtle

0

如果您安装了PgAdmin4,则非常简单,只需执行以下步骤...

  1. 转到表属性(右键单击表并选择属性)。
  2. 将打开一个窗口,然后导航到“属性”窗口中的“约束”
  3. 约束”选项中,您将看到以下屏幕截图所示的选项,只需转到“唯一”,您将看到具有唯一约束的列。单击删除按钮并保存。就是这样,你很高兴。 在此处输入图片说明
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.