2013-07-05 13 views
6

私はpostgresqlデータベースにたくさんのデータを持っています。私は、2つのキーがユニークなペアを形成しなければならないと考えているので、 そのようにデータベース内で強制したい。私は試してみます重複する複数の列のエントリpostgresql

create unique index key1_key2_idx on table(key1,key2) 

しかし、それは私が重複したエントリを持っていることを伝えて失敗します。

これらの重複したエントリを見つけて削除するにはどうすればよいですか?

答えて

1

は受け入れ答えが不正確である、あなただけの重複を削除し、元のを維持したいと仮定すると - それはオリジナルも削除して、最初から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

はそのwikiに情報の一部はしかし、*非常に*時代遅れであることに注意してください。 Pgの何かがある意味で動作しているとか、何かできることができないと言ったら、公式の文書をもう一度確認してください。 –

+1

この回答の正確さはわかりません。これにより、dupsだけでなく、オリジナルも削除されます。 IEの場合、同じ列セットの2つのエントリがある場合、この選択は、dupsだけでなく、両方を一致/削除します。もちろん、制約を満たすこともできますが、有効なデータを失っただけです(1つ以上のコピーを含むエントリはすべて失われます)。 – rocksfrow

関連する問題