创建后,是否可以在PostgreSQL表中添加UNIQUE约束?


185

我有下表:

 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在这一点上添加约束吗?


Answers:


362

psql的内联帮助:

\h ALTER TABLE

postgres文档中也有记录(一个很好的资源,也易于阅读)。

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);

6
谢谢@hhaamu。是的,确实尝试了这些文档,但是您的操作更为简洁。
Thomas Browne

117
如果要让PostgreSQL生成索引名,请使用ALTER TABLE tablename ADD UNIQUE (columns);。(请注意,CONSTRAINT关键字必须省略。)
jpmc26 2014年

5
我需要针对这个问题的答案,并开始搜寻文档。我没有使用Postgres文档,而是在StackOverflow上遇到了这个话题。因此,尽管参考官方文档是一个很好的想法,但为以后的访问给出答案也是很好的。谢谢你
伦纳德

@ jpmc26«如果要让PostgreSQL生成索引名»您是指约束名吗?
tuxayo

4
@tuxayo,唯一约束是通过Postgres中的索引来实现的(不要学究)。
克里斯·W

36

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

CREATE UNIQUE INDEX constraint_name ON table_name (columns);

3
谢谢Zeck-2年后的回答很不错,但仍然感谢人们仍然花时间!汤姆
托马斯·布朗

1
那是不对的。在最新的Postgres中,这还会导致类似“键(uuid)=(3a533772-07ac-4e76-b577-27a3878e2222)被重复。查询失败”的消息,如果您的值不是唯一的……
Strinder

3
@Strinder,那不是一件好事吗?首先修复重复的数据。
杰森

3
@Jasen完全清楚。只是想强调答案“但是,如果您的表上有非唯一条目。这是在表上添加唯一约束的方法。” 不管用。当然,非唯一条目必须始终预先合并。
Strinder

编辑的清晰度答案
泽维尔浩

6

如果您有一个表,该表已经具有基于以下条件的现有约束:名称和姓氏,并且想要添加另一个唯一约束,则必须通过以下方式删除整个约束:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

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

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

5

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


7
select <column> from <table> group by 1 having count(*) > 1;将提供有关重复值的报告。
杰森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.