Mysql
 sql >> Database >  >> RDS >> Mysql

Elimina tutte le righe duplicate tranne una in MySQL?

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.

  1. 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
    
  2. 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;