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
)