在PostgreSQL表已经创建之后,我可以为它添加一个UNIQUE约束吗?

Tho*_*wne 165 sql database postgresql indexing unique-constraint

我有下表:

 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
Run Code Online (Sandbox Code Playgroud)

对于任何给定tickername/ tickerbbname对,我不希望任何列都有多个列.我已经创建了表并且其中包含大量数据(我已经确保它符合唯一标准).然而,随着它变得越来越大,错误的空间越来越大.

有没有办法UNIQUE在这一点上添加约束?

hha*_*amu 332

psql内联帮助:

\h ALTER TABLE
Run Code Online (Sandbox Code Playgroud)

还有postgres文档中的文档(一个很好的资源,也很容易阅读).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);
Run Code Online (Sandbox Code Playgroud)

  • 如果你想让PostgreSQL生成索引名,请使用`ALTER TABLE tablename ADD UNIQUE(columns);`.(注意,必须省略`CONSTRAINT`关键字.) (98认同)
  • 我需要回答这个问题并开始在网上搜索文档.而不是Postgres文档,我在StackOverflow上遇到了这个主题.因此,尽管参考官方文档是一个很好的想法,但为未来的访问提供答案也是非常好的.谢谢你. (5认同)
  • 谢谢@hhaamu.是的确尝试过文档,但上面的内容更简洁. (4认同)
  • @tuxayo,一个唯一约束是通过Postgres中的索引实现的(不是迂腐). (3认同)

Zec*_*eck 32

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

CREATE UNIQUE INDEX constraint_name ON table_name (columns);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢Zeck - 很好的2y以后回答但仍然感谢人们仍然花时间!汤姆 (3认同)
  • @Jasen那是完全清楚的.只是想强调答案"但如果你的桌子上有非独特的条目.以下是如何在你的桌子上添加唯一约束." 不管用.当然,必须始终合并非唯一条目. (3认同)
  • @Strinder,那不是一件好事吗?首先修复重复的数据。 (2认同)

Luc*_*pos 11

如果您的表已经存在基于以下条件的约束:name 和 lastname,并且您想再添加一个唯一约束,则必须通过以下方式删除整个约束:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);
Run Code Online (Sandbox Code Playgroud)


Jor*_*nes 5

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

  • “从<table>组中选择<column>并以count(*)> 1的1来选择;”将给出重复值的报告。 (7认同)