Avviso dell'editore:questa soluzione è inefficiente dal punto di vista computazionale e potrebbe interrompere la connessione per un tavolo di grandi dimensioni.
NB - Hai necessità per farlo prima su una copia di prova della tua tavola!
Quando l'ho fatto, ho scoperto che, a meno che non includessi anche AND n1.id <> n2.id
, ha eliminato ogni riga della tabella.
-
Se vuoi mantenere la riga con il
id
più basso valore:DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
-
Se vuoi mantenere la riga con il
id
più alto valore:DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
Ho usato questo metodo in MySQL 5.1
Non sono sicuro delle altre versioni.
Aggiornamento:poiché le persone che cercano su Google di rimuovere i duplicati finiscono qui
Sebbene la domanda dell'OP riguardi DELETE
, tieni presente che utilizzando INSERT
e DISTINCT
è molto più veloce. Per un database con 8 milioni di righe, la query seguente ha richiesto 13 minuti, utilizzando DELETE
, ci sono volute più di 2 ore e tuttavia non è stato completato.
INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
SELECT DISTINCT cellId,attributeId,entityRowId,value
FROM tableName;