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:
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.
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:
Wady:
Inżynier regularnie analizuje duplikaty za pomocą specjalistycznych raportów, czyści bazę, tworzy unikalne indeksy. Przed migracją nowych danych przeprowadza walidację.
Zalety:
Wady: