Um herauszufinden, ob irgendwelche vollständiges Duplikat existiert (identisch auf allen Spalten), das ist wahrscheinlich der schnellste Weg:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
NATURAL JOIN
ist eine sehr bequeme Abkürzung für den Fall, weil (Zitat das Handbuch hier
):
EXISTS
ist wahrscheinlich am schnellsten, da Postgres die Suche beendet, sobald das erste Duplikat gefunden wird. Da Sie höchstwahrscheinlich keinen Index haben, der die gesamte Zeile abdeckt, und Ihre Tabelle riesig ist, sparen Sie dadurch viel der Zeit.
Beachten Sie, dass NULL
ist nie als identisch mit einem anderen NULL
angesehen . Wenn Sie NULL
haben Werte und betrachte sie als identisch, müssten Sie mehr tun.
ctid
ist eine Systemspalte
die als Ad-hoc-Primärschlüssel (missbraucht) werden können, aber auf Dauer keinen tatsächlichen benutzerdefinierten Primärschlüssel ersetzen können.
Die veraltete Version 8.1 scheint kein <>
zu haben Operator definiert für eine ctid
. Versuchen Sie, in text
umzuwandeln :
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)