可以在 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 约束吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Csharpcodeprovider 创建 DLL 并向其添加资源