可以在 PostgreSQL 表创建后向其添加 UNIQUE 约束吗?

Posted

技术标签:

【中文标题】可以在 PostgreSQL 表创建后向其添加 UNIQUE 约束吗?【英文标题】:Can I add a UNIQUE constraint to a PostgreSQL table, after it's already created? 【发布时间】: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 约束?

【问题讨论】:

How do I ALTER a PostgreSQL table and make a column unique? 的可能重复项 【参考方案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关键字必须省略。) 我需要这个问题的答案并开始在谷歌上搜索文档。我在 *** 上遇到了这个主题,而不是 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; 将报告重复值。

以上是关于可以在 PostgreSQL 表创建后向其添加 UNIQUE 约束吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在当前选定的表格单元格移出屏幕后向其发送消息?

如何在表中创建新列并向其添加值

创建实例后向 Vue 实例添加组件

使用 Csharpcodeprovider 创建 DLL 并向其添加资源

使用 EF CodeF 和 mvc nugget Scaffold 发布后向 DB 添加列

联系表 7:点击提交后向 <input> 添加一个类