我的postgresql 9.0 db中有一个基于函数的唯一索引。我还没有通过我尝试的任何手动测试使其失败,但是当我查询它时,我在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行。
答案 0 :(得分:1)
如果您手动尝试使数据库系统失败,则可能会遇到索引损坏。尝试重建索引(REINDEX
)。如果由于重复值而失败,那就是它。
答案 1 :(得分:0)
您可以在PostgreSQL中禁用触发器。这是一个非常危险的选项,但可用于将数据实际添加到违反唯一或外键约束的表中。
答案 2 :(得分:0)
如果您正在使用表继承,则可能导致此问题,因为不会继承唯一约束。事实上,这可能是此类事情的最常见原因,而且不是数据损坏。
如果删除并重新创建索引,它会失败吗?
如果没有,您的复制就在其他地方。