Doppelte Einträge aus der Datenbank löschen
Wie entfernt man mit einer Datenbankabfrage doppelte Einträge in einer Tabelle, ohne temporäre Tabellen erstellen zu müssen? Hier ein Beispiel für drei populäre Datenbanksysteme, die sich bei uns im Einsatz befinden: MSSQL, MySQL und Postgres.
Ums gleich vorweg zu nehmen: Natürlich ist es besser, doppelte Einträge gar nicht erst entstehen lassen. Beispielsweise durch Überprüfen der einzutragenden Daten bevor sie eben den Weg in die Datenbank finden. Leider wird das nicht immer respektive nicht immer konsequent gemacht und so stösst man ab und zu auf dieses Problem.
Als Beispiel nehmen wir eine einfache Tabelle comment, die folgende Spalten enthält:
- id
- name
- message
Die Tabelle kann enthält, wie der Name bereits verrät, möglichweise Daten eines simplen Kontaktformulars oder eine Gästebuchs. Doppelte Einträge entstehen dabei leicht, wenn beispielsweise das Formular mehrfach abgesendet werden kann (Gruss an alle Doppelklicker im Internet) oder durch Formular-Spam, der nicht entdeckt und gefiltert wird.
Mit einem einzigen Query können nun bei PostgreSQL und Microsofts SQL-Server Duplikate entfernt werden:
2WHERE id IN (
3 SELECT id FROM comment
4 WHERE EXISTS(
5 SELECT NULL FROM comment AS tmpcomment
6 WHERE comment.email = tmpcomment.email
7 AND comment.name = tmpcomment.name
8 AND comment.message = tmpcomment.message
9 HAVING comment.id > MIN(tmpcomment.id)
10 )
11 )
Für MySQL (getestet mit der 5er-Version) sieht die Abfrage ein wenig anders aus:
2USING comment, comment as tmpcomment
3WHERE NOT comment.id=tmpcomment.id
4 AND comment.id > tmpcomment.id
5 AND comment.name=tmpcomment.name
6 AND comment.email=tmpcomment.email
7 AND comment.message=tmpcomment.message