2011-02-16 82 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

如果您使用的是表繼承,那麼可能會導致這種情況,因爲唯一約束沒有被繼承。實際上,這可能是這種事情最常見的原因,它不是數據損壞。

如果您刪除並重新創建索引,它會失敗嗎?

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