Per scoprire se qualsiasi esiste un duplicato completo (identico su tutte le colonne), questo è probabilmente il modo più veloce:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
NATURAL JOIN
è una scorciatoia molto conveniente per il caso perché (citando il manuale qui
):
EXISTS
è probabilmente il più veloce, perché Postgres interrompe la ricerca non appena viene trovato il primo duplicato. Dal momento che molto probabilmente non hai un indice che copre l'intera riga e la tua tabella è enorme, questo ti farà risparmiare molto di tempo.
Tieni presente che NULL
è mai considerato identico a un altro NULL
. Se hai NULL
valori e considerali identici, dovresti fare di più.
ctid
è una colonna di sistema
che può essere (ab-)utilizzato come chiave primaria ad hoc, ma non può sostituire una vera chiave primaria definita dall'utente a lungo termine.
La versione obsoleta 8.1 sembra non avere <>
operatore definito per un ctid
. Prova a trasmettere a text
:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)