2013-07-05 72 views
6

我有一堆postgresql數據庫中的數據。我認爲兩個密鑰應該形成一個唯一的對, 所以想要在數據庫中執行該密鑰。我嘗試重複的多列條目postgresql

create unique index key1_key2_idx on table(key1,key2) 

但是,失敗,告訴我,我有重複的條目。

如何找到這些重複條目,以便我可以刪除它們?

回答

1

假設你只想要刪除的重複和保持原來的,公認的答案是不正確的 - 它同樣會刪除您的原件,並且只保留從一開始就有一個條目的記錄。這部作品的9.x:

SELECT * FROM tblname WHERE ctid IN 
(SELECT ctid FROM 
    (SELECT ctid, ROW_NUMBER() OVER 
    (partition BY col1, col2, col3 ORDER BY ctid) AS rnum 
    FROM tblname) t 
WHERE t.rnum > 1); 

https://wiki.postgresql.org/wiki/Deleting_duplicates

16
select key1,key2,count(*) 
from table 
group by key1,key2 
having count(*) > 1 
order by 3 desc; 

確定重複項的查詢的關鍵部分是having count(*) > 1

還有一大堆在以下鏈接巧妙的技巧,包括刪除重複的一些例子:http://postgres.cz/wiki/PostgreSQL_SQL_Tricks

+0

要知道,有些對維基的信息是非常* *過時,但。當它說Pg中的某些行爲以某種方式行事或者你不能做某件事情時,請仔細檢查官方文檔。 –

+1

我不明白這個答案是準確的。這會導致您丟棄原件 - 而不僅僅是dups。 IE瀏覽器,如果你有兩個相同列集的條目,這個選擇將匹配/放棄他們兩個 - 不僅是dups。當然,你會滿足約束 - 但你也只是失去了有效的數據(超過1副本的任何條目將完全丟失)。 – rocksfrow