【发布时间】:2020-01-05 08:17:31
【问题描述】:
运行 Postgres 9.6。
我正在尝试编写数据库迁移代码以删除冗余的唯一约束和索引。问题是在某些安装中存在这些索引和约束,而在其他安装中则不存在。
推荐的丢弃方式是:
alter table <table_name> drop constraint <unique_name>
但是当约束不存在并且没有“如果存在”子句时,这将失败。 “drop index”命令有一个“if exists”子句,但最初也失败了:
db=> drop index if exists <unique_name>;
ERROR: cannot drop index <unique_name> because constraint <unique_name> on table <table_name> requires it
但是等等,“drop index”有一个“cascade”选项来删除依赖对象,所以我们可以使用它!
嗯,不。我得到了同样的回应:
db=> drop index if exists <unique_name> cascade;
ERROR: cannot drop index <unique_name> because constraint <unique_name> on table <table_name> requires it
注意:我看过很多看似相关的答案,其中“级联”解决了人们的问题,但这些都提到外键约束,而不是唯一约束。
注意:这与尝试并发删除索引时不支持级联的事实无关;当您添加“并发”关键字时,您会得到一个非常明确的
ERROR: DROP INDEX CONCURRENTLY does not support CASCADE
这是一个已知的错误吗?还是我错过了什么?
【问题讨论】:
标签: postgresql