PostgreSQL UNIQUE索引不是唯一的吗?

时间:2010-08-17 06:15:53

标签: postgresql

我有一个包含12列UNIQUE索引的表。 \d sales显示sales_uq UNIQUE, btree (a1, a2, a3, ... a12)

我执行以下查询:

SELECT a1, a2, a3, ... a12 FROM sales GROUP BY a1, a2, a3, ... a12 HAVING count(1) > 1;

我得到了一堆结果。怎么可能?!索引是否可能存在,但某种程度上是禁用的?或者是否存在NULL问题?或者使用浮点数(索引中的两列是double precision类型的)?

2 个答案:

答案 0 :(得分:12)

因为两个NULL不相等,所以它们会玩UNIQUE约束的有趣游戏。

参见PostgreSQL documentation中的UNIQUE约束的最后一段:

  

一般来说,唯一的约束是   当有两个或更多时违反   表中的行所在的值   所有列都包括在内   约束是平等的。但是,两个   空值不被视为相等   在这个比较中。这意味着即使在   它存在一个独特的约束   可以存储重复的行   至少包含空值的   其中一个受约束的列。

答案 1 :(得分:2)

双倍是inexact,这就是为什么会发生这种情况。使用确切的数据类型,你就不会遇到这样的问题。