2

我的 postgresql 9.0 db 中有一个基于函数的唯一索引。我还没有通过我尝试的任何手动测试使其失败,但是当我查询它时,我在数据库中看到了一些重复项。

看一下这个:

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 行。

4

3 回答 3

1

如果您一直在手动尝试使数据库系统失败,那么您可能遇到了索引损坏。尝试重建索引 ( REINDEX)。如果由于重复值而失败,那么就是这样。

于 2011-02-16T04:37:05.957 回答
0

如果您使用的是表继承,则可能会导致这种情况,因为不会继承唯一约束。事实上,这可能是这类事情的最常见原因,而不是数据损坏。

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

如果没有,你的重复在别处。

于 2012-09-28T12:56:32.753 回答
0

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

于 2011-02-16T04:53:16.833 回答