Om te zien of een volledig duplicaat bestaat (identiek op alle kolommen), dit is waarschijnlijk de snelste manier:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
NATURAL JOIN
is een erg handige afkorting voor de zaak omdat (onder vermelding van de handleiding hier
):
EXISTS
is waarschijnlijk het snelst, omdat Postgres stopt met zoeken zodra het eerste duplicaat is gevonden. Aangezien je hoogstwaarschijnlijk geen index hebt die de hele rij dekt en je tabel enorm is, zal dit je veel besparen. tijd.
Houd er rekening mee dat NULL
is nooit beschouwd als identiek aan een andere NULL
. Als u NULL
. heeft waarden en ze als identiek beschouwen, zou je meer moeten doen.
ctid
is een systeemkolom
die kan worden (misbruikt) als ad-hoc primaire sleutel, maar kan op de lange termijn niet een daadwerkelijke door de gebruiker gedefinieerde primaire sleutel vervangen.
De verouderde versie 8.1 lijkt geen <>
. te hebben operator gedefinieerd voor een ctid
. Probeer te casten naar text
:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)