在我的 PostgreSQL 数据库中,我以这种方式创建了一个唯一索引:
CREATE UNIQUE INDEX <my_index> ON <my_table> USING btree (my_column)
有没有办法改变索引来删除唯一约束?我查看了ALTER INDEX 文档,但它似乎没有满足我的需求。
我知道我可以删除索引并创建另一个索引,但我想找到更好的方法,如果它存在的话。
在我的 PostgreSQL 数据库中,我以这种方式创建了一个唯一索引:
CREATE UNIQUE INDEX <my_index> ON <my_table> USING btree (my_column)
有没有办法改变索引来删除唯一约束?我查看了ALTER INDEX 文档,但它似乎没有满足我的需求。
我知道我可以删除索引并创建另一个索引,但我想找到更好的方法,如果它存在的话。
您也许可以删除 unique CONSTRAINT
,而不是INDEX
本身。
检查您的CONSTRAINTS
通过select * from information_schema.table_constraints;
然后,如果你找到一个,你应该可以像这样丢弃它:
ALTER TABLE <my_table> DROP CONSTRAINT <constraint_name>
编辑: this question中描述了一个相关问题
假设您有以下内容:
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 [索引],您可以使用DROP INDEX:
DROP INDEX feature_unique;
我不认为这是可能的......即使在 pgAdmin III UI 中,如果您尝试编辑使用您的语句创建的约束,“唯一”框是灰色的;您无法通过 UI 更改它。结合您对 ALTER INDEX 文档的研究,我认为这是不可能的。
为同一个问题搜索了几个小时,但似乎没有得到正确的答案——所有给定的答案都没有奏效。
对于not null,我也花了一些时间才找到。显然由于某种原因,多数认证代码在我使用时不起作用。
我得到了非空版本代码,像这样
ALTER TABLE tablename
ALTER COLUMN column_want_to_remove_constriant
DROP NOT NULL
可悲的是,将 'not null' 更改为 'unique' 不起作用。
这对我有用,无需指定表,因为在您的情况下索引是唯一的:
DROP INDEX if exists my_index_name;