2011-02-16 51 views
2

我有一个独特的索引在我的postgresql 9.0分贝,基于一个函数。我还没有使任何手动测试失败,但我在查询时发现数据库中有一些重复项。为什么我对唯一索引有非唯一条目? (PostgreSQL 9.0)

检查了这一点:

Index: "users_screen_name_idx" UNIQUE, btree (lower(screen_name::text)) 

# select lower(screen_name), count(1) from users group by lower(screen_name) having count(1) > 1; 

lower   | count 
---------------+------- 
xxx xxx 3735 |  2 
xxx xxx 37383 |  2 
... (36 more) ... 
       | 17254 
(39 rows) 

任何想法如何,这是怎么回事?我知道NULL不是唯一的,这不是问题,它是其他38行。

+0

这是一些可怕的sh * t。我真的希望9.3通过校验和得到一些内置的验证,并且在系统开始返回不正确的结果之前哪些内容不会捕获这些验证。我还想知道,如果数据是在ZFS文件系统上,如果这种类型的东西会被捕获和/或阻止。 – Kuberchaun 2012-09-28 14:02:22

回答

1

如果您已经手动尝试使数据库系统发生故障,可能是您已经遇到索引损坏。尝试重建索引(REINDEX)。如果由于重复值而失败,就是这样。

+0

有没有办法检查索引损坏是否是一个主动的过程,而不是做一个REINDEX并查看它是否失败? – Kuberchaun 2011-02-16 14:44:04

+0

不是,但是普通的真空会做一些附带的检查。 – 2011-02-16 20:16:58

0

您可以在PostgreSQL中禁用触发器。这是一个非常危险的选项,但可以用于实际将数据添加到违反唯一或外键约束的表中。

0

如果您使用的是表继承,那么可能会导致这种情况,因为唯一约束没有被继承。实际上,这可能是这种事情最常见的原因,它不是数据损坏。

如果您删除并重新创建索引,它会失败吗?

如果不是,您的重复是在其他地方。