【问题标题】:Cannot drop index because unique constraint requires it (postgres)无法删除索引,因为唯一约束需要它(postgres)
【发布时间】: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


    【解决方案1】:

    您可以使用DO 语句并捕获错误:

    DO
    $$BEGIN
       ALTER TABLE <table_name> DROP CONSTRAINT <unique_name>;
    EXCEPTION
       WHEN undefined_object
          THEN NULL;  -- ignore the error
    END$$;
    

    【讨论】:

    • 绝对的救命稻草
    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2016-08-10
    • 2011-12-29
    • 2014-10-05
    相关资源
    最近更新 更多