sql >> Database teknologi >  >> RDS >> PostgreSQL

Tjek for fuldstændige duplikerede rækker i en stor tabel

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
    )


  1. Validering UNIKT felt i Codeigniter med 2 indeks

  2. Hvordan samles datatyper som heltal (heltal med heltal) &varchar (varchar med varchar) i mysql?

  3. ORA-00932:inkonsistente datatyper:forventet - fik CLOB

  4. Mysql Auto-incrementing int af lignende data