Pour savoir si tout le doublon complet existe (identique sur toutes les colonnes), c'est probablement le moyen le plus rapide :
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
NATURAL JOIN
est un raccourci très pratique pour le cas car (en citant le manuel ici
):
EXISTS
est probablement le plus rapide, car Postgres arrête la recherche dès que le premier doublon est trouvé. Étant donné que vous n'avez probablement pas d'index couvrant toute la ligne et que votre table est énorme, cela vous fera économiser beaucoup de temps.
Soyez conscient que NULL
n'est jamais considéré comme identique à un autre NULL
. Si vous avez NULL
valeurs et considérez-les comme identiques, vous devrez faire plus.
ctid
est une colonne système
qui peut être (ab-)utilisée comme clé primaire ad-hoc, mais ne peut pas remplacer une clé primaire réelle définie par l'utilisateur à long terme.
La version obsolète 8.1 semble ne pas avoir de <>
opérateur défini pour un ctid
. Essayez de caster en text
:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)