【问题标题】:Can I add a UNIQUE constraint to a PostgreSQL table, after it's already created?可以在 PostgreSQL 表创建后向其添加 UNIQUE 约束吗?
【发布时间】:2010-11-14 17:34:02
【问题描述】:

我有下表:

 tickername | tickerbbname  | tickertype
------------+---------------+------------
 USDZAR     | USDZAR Curncy | C
 EURCZK     | EURCZK Curncy | C
 EURPLN     | EURPLN Curncy | C
 USDBRL     | USDBRL Curncy | C
 USDTRY     | USDTRY Curncy | C
 EURHUF     | EURHUF Curncy | C
 USDRUB     | USDRUB Curncy | C

对于任何给定的tickername/tickerbbname 对,我不希望有超过一列。我已经创建了表格并且里面有很多数据(我已经确保满足唯一的标准)。然而,随着它变得越来越大,错误的空间就会蔓延。

此时有没有办法添加UNIQUE 约束?

【问题讨论】:

标签: sql database postgresql indexing unique-constraint


【解决方案1】:

如果您的表已经有一个现有的约束,例如:name 和 lastname,并且您想再添加一个唯一约束,则必须通过以下方式删除整个约束:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

确保您要添加的新约束在该表的所有数据中是唯一的/不为空(如果是 Microsoft Sql,则它只能包含一个空值),然后您可以重新创建它。

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);

【讨论】:

    【解决方案2】:

    psql 的内联帮助:

    \h ALTER TABLE
    

    还记录在 postgres docs 中(一个极好的资源,而且易于阅读)。

    ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);
    

    【讨论】:

    • 感谢@hhaamu。是的,确实尝试过文档,但您的上述内容更加简洁。
    • 如果要让PostgreSQL生成索引名,使用ALTER TABLE tablename ADD UNIQUE (columns);。 (注意CONSTRAINT关键字必须省略。)
    • 我需要这个问题的答案并开始在谷歌上搜索文档。我在 StackOverflow 上遇到了这个主题,而不是 Postgres 文档。所以虽然参考官方文档是个不错的想法,但给以后访问的答案也很好。谢谢你。
    • @jpmc26 «如果你想让PostgreSQL生成索引名» 你的意思是约束名?
    • @tuxayo,唯一约束是通过 Postgres 中的索引实现的(不要学究气)。
    【解决方案3】:

    是的,你可以。但是,如果您的表中有非唯一条目,它将失败。以下是如何在您的表上添加唯一约束。如果您使用的是 PostgreSQL 9.x,您可以按照以下说明进行操作。

    CREATE UNIQUE INDEX constraint_name ON table_name (columns);
    

    【讨论】:

    • 感谢 Zeck - 2 年后的回答很好,但仍然感谢人们仍然花时间!汤姆
    • 这不正确。在最新的 Postgres 中,如果您的值不是唯一的,这也会导致类似“Key (uuid)=(3a533772-07ac-4e76-b577-27a3878e2222) 重复。查询失败”的消息...
    • @Strinder,这不是一件好事吗?先修复重复的数据。
    • @Jasen 这很清楚。只是想强调答案“但是如果你的表上有非唯一条目。这是如何在你的表上添加唯一约束。”不管用。非唯一条目当然必须事先合并。
    • 为清晰起见编辑了答案
    【解决方案4】:

    是的,您可以在事后添加 UNIQUE 约束。但是,如果您的表中有非唯一条目,Postgres 会抱怨它,直到您更正它们。

    【讨论】:

    • select <column> from <table> group by 1 having count(*) > 1; 将报告重复值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多