Das Problem von Duplikaten in Tabellen ist eines der ältesten in SQL, das insbesondere mit dem massiven Wachstum von Internetdiensten und der Migration großer Datenmengen verstärkt wurde. Ursprünglich wurde das Problem manuell gelöst: Duplikate wurden mit einmaligen Skripten gefunden und entfernt, aber mit dem Wachstum der Daten wurde dieser Ansatz ineffektiv.
Problem: Bei unsachgemäßer Datenladung, Migration oder Störungen entstehen häufig Zehntausende von Zeilen mit identischen Schlüsselmerkmalen (z.B. E-Mail oder Ausweis). Dies führt zu Fehlern bei Integrationen, fehlerhafter Analyse und Vertrauensverlust der Kunden.
Lösung: Berichte über Duplikate erstellen durch Gruppierung und Fensterfunktionen; das Löschen von Duplikaten implementieren, wobei ein "korrektes" verbleiben soll; UNIQUE-Beschränkungen für Schlüsselspalten hinzufügen und regelmäßige Audits durchführen.
Beispielcode
WITH Duplikate AS ( SELECT email, COUNT(*) AS cnt FROM users GROUP BY email HAVING COUNT(*) > 1 ) SELECT u.* FROM users u JOIN Duplikate d ON u.email = d.email ORDER BY u.email, u.id;
Löschen von Duplikaten (unter Beibehaltung der Zeile mit der minimalen id):
DELETE FROM users WHERE id NOT IN ( SELECT MIN(id) FROM users GROUP BY email );
Wesentliche Merkmale:
Kann man DISTINCT verwenden, um Duplikate aus einer Tabelle zu entfernen?
Nein, DISTINCT funktioniert nur bei Auswahlabfragen (SELECT) und entfernt keine Zeilen aus der Tabelle. Man muss DELETE oder INSERT ... SELECT mit DISTINCT verwenden, um eine neue saubere Tabelle zu erstellen.
Entfernt der Befehl DELETE ... WHERE id NOT IN (SELECT MIN(id) ...) garantiert alle Duplikate?
Nein, wenn es NULL im Schlüsselspalten gibt, kann dieser Befehl fälschlicherweise Duplikate aufgrund von Vergleichen mit NULL-Werten zurücklassen.
Reicht es aus, einen UNIQUE INDEX zu erstellen, um nie wieder Duplikate zu haben?
Nein, der Index schützt nur vor neuen Versuchen, Duplikate einzufügen, hat jedoch keine Auswirkungen auf bereits bestehende Wiederholungen in der Tabelle.
Ein CRM-System kopiert Benutzer aus verschiedenen Quellen, ohne die E-Mail-Einzigartigkeit zu berücksichtigen; in der Datenbank gibt es 50000 Duplikate. Das massenhafte Hinzufügen eines UNIQUE-Indexes führt zu einem Ausfall, der Dienst steht still.
Vorteile:
Nachteile:
Ein Ingenieur analysiert regelmäßig Duplikate über spezialisierte Berichte, bereinigt die Datenbank und erstellt einzigartige Indizes. Vor der Migration neuer Daten führt er eine Validierung durch.
Vorteile:
Nachteile: