2013-07-05 5 views
6

Ho un sacco di dati in un database postgresql. Penso che due chiavi dovrebbero formare una coppia unica, , quindi voglio applicarla nel database. Provovoci multi colonna duplicate postgresql

create unique index key1_key2_idx on table(key1,key2) 

ma che fallisce, dicendomi che ho voci duplicate.

Come trovo queste voci duplicate in modo da poterle eliminare?

risposta

1

Supponendo che si desidera solo eliminare i duplicati e mantenere l'originale, la risposta accettata è imprecisa - è Eliminerò anche gli originali e conserveremo solo i record con una voce dall'inizio. Questo funziona su 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; 

La parte critica della query per determinare i duplicati è having count(*) > 1.

ci sono un sacco di trucchetti al seguente link, tra cui alcuni esempi di rimozione dei duplicati: http://postgres.cz/wiki/PostgreSQL_SQL_Tricks

+0

essere consapevoli del fatto che alcune delle informazioni che wiki è * molto * obsolete, però. Controlla con la documentazione ufficiale quando dice che qualcosa in Pg si comporta in un certo modo o che non puoi fare una determinata cosa. –

+1

Non vedo come questa risposta sia accurata. Ciò comporta la caduta degli originali, non solo dei duplicati. Ad esempio, se si hanno 2 voci dello stesso set di colonne, questa selezione corrisponderà/eliminerà entrambe, non solo i duplicati. Certo, soddisferai il vincolo, ma hai anche perso i dati validi (tutte le voci con più di una copia andranno completamente perse). – rocksfrow