【问题标题】:Remove uniqueness of index in PostgreSQL删除 PostgreSQL 中索引的唯一性
【发布时间】:2013-09-02 02:41:19
【问题描述】:

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

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

有没有办法改变索引来移除唯一约束?我查看了ALTER INDEX documentation,但它似乎没有满足我的需求。

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

【问题讨论】:

    标签: sql database postgresql


    【解决方案1】:

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

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

    如果你找到了,你应该可以像这样丢弃它:

    ALTER TABLE &lt;my_table&gt; DROP CONSTRAINT &lt;constraint_name&gt;

    编辑:this question中描述了一个相关问题

    【讨论】:

    • 感谢您的建议。不幸的是,没有这样的限制。
    • 是的,我也想到了这个,但是在 Postgres 中检查了它...添加唯一索引不会对表添加约束...它似乎是索引本身的一部分。
    • @dcsohl 是的。这很有趣,我研究了一下,根据this question 唯一约束可以创建索引(但不能反过来)
    • @SergeyPotapov 此答案不能解决您的问题所提出的问题。你能重新审视这个问题并选择correct answer吗?
    • 不起作用 - 表示约束不存在。
    【解决方案2】:

    假设你有以下:

    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;
    

    要删除主键,您还可以使用ALTER TABLE

    ALTER TABLE feature DROP CONSTRAINT feature_pkey;
    

    要删除 UNIQUE [索引],您可以使用 DROP INDEX

    DROP INDEX feature_unique;
    

    【讨论】:

    • 也不起作用。索引“不存在”但无法再次创建,因为“关系“”已经存在:
    • @niedomnie 这是一个不同的问题。您需要检查您的架构中是否存在具有相同名称的其他关系(例如表名)。见相关话题stackoverflow.com/a/8835441/2074605
    • 约束会占用内存吗?
    • @KIRANKUMARMATAM 不,添加或删除约束不会对 PostgreSQL 中的内存消耗产生任何直接的、可测量的影响。唯一的例外可能是deferred constraints,它在事务结束时应用,这将完全取决于您的特定数据库。
    • @vallismortis 感谢回复我的意思是数据库中的空间?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      为同一个问题搜索了几个小时,但似乎没有得到正确的答案----所有给出的答案都没有奏效。

      对于not null,我也花了一些时间才找到。显然由于某种原因,多数认证代码在我使用时不起作用。

      我得到了非空版本代码,类似这样的

      ALTER TABLE tablename
      ALTER COLUMN column_want_to_remove_constriant
      DROP NOT NULL
      

      可悲的是,将 'not null' 更改为 'unique' 不起作用。

      【讨论】:

      • 这似乎与要求更改索引的问题无关。
      【解决方案5】:

      这对我有用,无需指定表,因为在您的情况下索引是唯一的:

      DROP INDEX if exists my_index_name;
      

      【讨论】:

        【解决方案6】:

        如果你已经安装了 PgAdmin4,这很简单,只需按照以下步骤操作...

        1. 转到表格属性(右键单击表格并选择属性)。
        2. 将打开一个窗口,然后导航到属性窗口中的约束
        3. Constraints 选项中,您将看到如下截图所示的选项,只需转到 Unique,您将看到具有唯一约束的列。单击删除按钮并保存。就是这样,你可以走了。

        【讨论】:

          猜你喜欢
          • 2020-10-01
          • 2021-02-27
          • 2018-08-13
          • 2016-07-06
          • 1970-01-01
          • 2019-10-23
          • 2018-12-02
          • 2019-01-13
          • 1970-01-01
          相关资源
          最近更新 更多