我有一个包含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
类型的)?
答案 0 :(得分:12)
因为两个NULL不相等,所以它们会玩UNIQUE约束的有趣游戏。
参见PostgreSQL documentation中的UNIQUE约束的最后一段:
一般来说,唯一的约束是 当有两个或更多时违反 表中的行所在的值 所有列都包括在内 约束是平等的。但是,两个 空值不被视为相等 在这个比较中。这意味着即使在 它存在一个独特的约束 可以存储重复的行 至少包含空值的 其中一个受约束的列。
答案 1 :(得分:2)
双倍是inexact,这就是为什么会发生这种情况。使用确切的数据类型,你就不会遇到这样的问题。