programowanieSQL/BI Analityk

Jak zaimplementować wyszukiwanie i przetwarzanie duplikatów w dużych tabelach SQL, aby zapewnić unikalność kluczowych danych?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

Problem duplikatów w tabelach to jeden z najstarszych problemów w SQL, szczególnie zaostrzony przez masowy wzrost usług internetowych i migrację dużych zbiorów danych. Na początku problem był rozwiązywany ręcznie: znajdowano duplikaty jednorazowymi skryptami, usuwano je, ale w miarę wzrostu danych, podejście to stawało się nieefektywne.

Problem: podczas niedbałego ładowania, migracji lub awarii często powstaje dziesiątki tysięcy wierszy z identycznymi cechami kluczowymi (na przykład email lub dowód osobisty). To prowadzi do błędów przy integracjach, nieprawidłowej analityki, utraty zaufania klientów.

Rozwiązanie: budować raporty o duplikatach za pomocą grupowania i funkcji okiennych; zrealizować usunięcie duplikujących się rekordów, zachowując jeden "prawidłowy"; dodać ograniczenia (UNIQUE) dla kluczowych pól oraz obowiązkowe regularne audyty.

Przykład kodu

WITH Duplikaty AS ( SELECT email, COUNT(*) AS cnt FROM users GROUP BY email HAVING COUNT(*) > 1 ) SELECT u.* FROM users u JOIN Duplikaty d ON u.email = d.email ORDER BY u.email, u.id;

Usunięcie duplikatów (zostawiając wiersz z minimalnym id):

DELETE FROM users WHERE id NOT IN ( SELECT MIN(id) FROM users GROUP BY email );

Kluczowe cechy:

  • Użycie GROUP BY, HAVING do wyszukiwania duplikatów
  • Automatyzacja usuwania przez NOT IN/EXISTS/ROW_NUMBER()
  • Wprowadzenie ograniczeń unikalności dla kluczowych pól

Pytania z pułapką.

Czy można używać DISTINCT do usuwania duplikatów z tabeli?

Nie, DISTINCT działa tylko dla selekcji (SELECT), nie usuwa wierszy z tabeli. Należy użyć DELETE lub INSERT ... SELECT z DISTINCT do stworzenia nowej czystej tabeli.

Czy polecenie DELETE ... WHERE id NOT IN (SELECT MIN(id) ...) gwarantuje usunięcie wszystkich duplikatów?

Nie, jeśli w kluczowej kolumnie są NULL, takie zapytanie może błędnie pozostawić duplikaty z powodu specyfiki porównywania wartości NULL.

Czy wystarczy stworzyć UNIQUE INDEX, aby więcej nigdy nie było duplikatów?

Nie, indeks ochroni tylko przed nowymi próbami wstawienia duplikatów, ale nie wpływa na już istniejące powtórzenia w tabeli.

Typowe błędy i antywzorce

  • Bezpośrednie usuwanie według jednej kolumny bez uwzględnienia NULL lub złożonych kluczy
  • Brak stałego monitorowania i logowania duplikatów
  • Ustawienie ograniczeń unikalności bez wcześniejszego oczyszczenia tabeli — prowadzi do błędu podczas tworzenia indeksu

Przykład z życia

Negatywny przypadek

System CRM kopiuje użytkowników z różnych źródeł, nie uwzględniając unikalności email, w bazie 50000 duplikatów. Masowe dodanie indeksu UNIQUE prowadzi do awarii, usługa przestaje działać.

Zalety:

  • Szybkie wdrożenie (przed indeksem)

Wady:

  • Utrata danych, awarie usług, awarie wsparcia

Pozytywny przypadek

Inżynier regularnie analizuje duplikaty za pomocą specjalistycznych raportów, czyści bazę, tworzy unikalne indeksy. Przed migracją nowych danych przeprowadza walidację.

Zalety:

  • Czyste dane kluczowe
  • Minimalizacja błędów w analityce

Wady:

  • Wymaga ustawień monitorowania i automatyzacji procedur