2014-04-03 12 views
0

我已經交給一個數據庫,處於一種奇怪的狀態。在過去的某個不確定的時間,我結束了在一個情況下,我不得不重複在同一個表中的行與相同的主鍵:LIMIT如何通過Postgres中的主鍵與DELETE進行交互? (修復損壞的唯一索引)

=> \d my_table 
Table "public.my_table" 
     Column  |   Type   | Modifiers 
--------------------+-------------------------+----------- 
id     | bigint     | not null 
some_data   | bigint     | 
a_string   | character varying(1024) | not null 
Indexes: 
"my_table_pkey" PRIMARY KEY, btree (id) 

=> SELECT id, count(*) FROM my_table GROUP BY id HAVING count(*) > 1 ORDER BY id; 
#50-some results, non-consecutive rows. 

我不知道數據庫如何進入這種狀態,但我希望能夠安全地擺脫它。如果,每個複製主鍵,如果我執行形式的查詢:

DELETE FROM my_table WHERE id = "a_duplicated_row" LIMIT 1; 

是不是隻打算從表中刪除一個行呢,還是要與給定的主刪除兩行鍵?

+0

據我所知,您輸入的SQL無效 - [PostgreSQL的DELETE語句手冊頁](http://www.postgresql.org/docs/current/interactive/sql-delete。 HTML)沒有提及「LIMIT」子句。所以當前問題的答案是「既不會,也會出錯」。在其他地方可以找到關於「如何刪除一對副本中的一行」的隱含問題的答案。 – IMSoP

+1

問題的標題應該更像「如何解決已損壞的唯一索引」 –

回答

2

唉,PostgreSQL還沒有實現DELETE或UPDATE的LIMIT。如果行無法以其他方式區分,則需要小心使用隱藏的ctid列來打破關係,如討論here。或者通過從現有表中選擇不同的元組來創建表,並重命名。

+1

@AndrewRueckert另外,請閱讀http://wiki.postgresql.org/wiki/Corruption。在你做任何事情之前,你應該*備份* - 最好是文件系統級副本(pg_basebackup)和帶有'pg_dump'的邏輯轉儲。一旦你解決了衝突,你應該重新索引,然後開始一些關於可能原因的嚴肅調查。 –