PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Sprawdź, czy w dużej tabeli nie ma zduplikowanych wierszy

Aby sprawdzić, czy jakikolwiek istnieje pełny duplikat (identyczny we wszystkich kolumnach), jest to prawdopodobnie najszybszy sposób:

SELECT EXISTS (
    SELECT 1
    FROM   tbl t
    NATURAL JOIN tbl t1 
    WHERE  t.ctid <> t1.ctid
    )

NATURALNE DOŁĄCZENIE jest bardzo wygodnym skrótem w tej sprawie, ponieważ (cytując instrukcja tutaj ):

ISTNIEJE jest prawdopodobnie najszybszy, ponieważ Postgres przestaje wyszukiwać po znalezieniu pierwszego duplikatu. Ponieważ najprawdopodobniej nie masz indeksu obejmującego cały wiersz, a Twoja tabela jest ogromna, zaoszczędzisz dużo czasu.

Pamiętaj, że NULL jest nigdy uważane za identyczne z innym NULL . Jeśli masz NULL wartości i uważaj je za identyczne, musisz zrobić więcej.

ctid to kolumna systemowa który może być (nad)używany jako klucz podstawowy ad-hoc, ale na dłuższą metę nie może zastąpić rzeczywistego klucza podstawowego zdefiniowanego przez użytkownika.

Nieaktualna wersja 8.1 wydaje się nie mieć <> operator zdefiniowany dla ctid . Spróbuj przesłać do tekstu :

SELECT EXISTS (
    SELECT 1
    FROM   tbl t
    NATURAL JOIN tbl t1 
    WHERE  t.ctid::text <> t1.ctid::text
    )


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę zrobić wiele order_by w Flask-SQLAlchemy?

  2. Wygeneruj sekwencję dat używanych w pętli for

  3. problem z uruchomieniem liquibase za pomocą maven i postgres-db

  4. Jak działa Acosd() w PostgreSQL

  5. Jaki jest MySQL odpowiednik funkcji EXPLAIN ANALYZE w PostgreSQL?