For at finde ud af, om enhver fuld duplikat eksisterer (identisk på alle kolonner), dette er sandsynligvis den hurtigste måde:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
NATURLIG JOIN
er en meget praktisk stenografi for sagen, fordi (citerer manualen her
):
FINDER
kode>
er nok hurtigst, fordi Postgres stopper med at søge, så snart den første duplikat er fundet. Da du højst sandsynligt ikke har et indeks, der dækker hele rækken, og din tabel er enorm, vil dette spare dig en masse af tid.
Vær opmærksom på, at NULL
er aldrig anses for at være identisk med en anden NULL
. Hvis du har NULL
værdier og betragte dem som identiske, skal du gøre mere.
ctid
er en systemkolonne
der kan (misbruges) som ad-hoc primærnøgle, men ikke kan erstatte en egentlig brugerdefineret primærnøgle i det lange løb.
Den forældede version 8.1 ser ikke ud til at have nogen <> operator defineret for en
ctid
. Prøv at caste til tekst
:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)