För att ta reda på om någon full dubblett finns (identiskt på alla kolumner), detta är förmodligen det snabbaste sättet:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
NATURLIG JOIN
är en mycket bekväm förkortning för fallet eftersom (citerar manualen här
):
FINNS
kod>
är förmodligen snabbast, eftersom Postgres slutar söka så fort den första dubbletten hittas. Eftersom du förmodligen inte har ett index som täcker hela raden och ditt bord är enormt, kommer detta att spara dig mycket tid.
Tänk på att NULL
är aldrig anses vara identisk med en annan NULL
. Om du har NULL
värderingar och betrakta dem som identiska, måste du göra mer.
ctid
är en systemkolumn
som kan (missbrukas) som ad-hoc primärnyckel, men inte kan ersätta en faktisk användardefinierad primärnyckel i det långa loppet.
Den föråldrade versionen 8.1 verkar inte ha någon <> operator definierad för en
ctid
. Testa att casta till text
:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)