Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Alle doppelten Zeilen außer One in MySQL löschen?

Warnung des Herausgebers:Diese Lösung ist rechenineffizient und kann Ihre Verbindung für eine große Tabelle unterbrechen.

NB - Sie brauchen dies zunächst an einer Probekopie zu tun Ihres Tisches!

Als ich es tat, fand ich das, es sei denn, ich fügte auch AND n1.id <> n2.id hinzu , es hat jede Zeile in der Tabelle gelöscht.

  1. Wenn Sie die Zeile mit der niedrigsten id behalten möchten Wert:

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
    
  2. Wenn Sie die Zeile mit der höchsten id behalten möchten Wert:

    DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
    

Ich habe diese Methode in MySQL 5.1

verwendet

Bei anderen Versionen bin ich mir nicht sicher.

Aktualisierung:Da Leute, die nach dem Entfernen von Duplikaten googeln, hier landen
Obwohl sich die Frage des OP auf DELETE bezieht , beachten Sie bitte, dass Sie INSERT verwenden und DISTINCT ist viel schneller. Für eine Datenbank mit 8 Millionen Zeilen dauerte die folgende Abfrage 13 Minuten, während DELETE verwendet wurde , es dauerte mehr als 2 Stunden und wurde dennoch nicht abgeschlossen.

INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
    SELECT DISTINCT cellId,attributeId,entityRowId,value
    FROM tableName;