Ostrzeżenie edytora:to rozwiązanie jest niewydajne obliczeniowo i może spowodować przerwanie połączenia w przypadku dużej tabeli.
Uwaga – potrzebujesz zrobić to najpierw na kopii testowej Twojego stołu!
Kiedy to zrobiłem, stwierdziłem, że chyba że dodałem również AND n1.id <> n2.id
, usunął każdy wiersz w tabeli.
-
Jeśli chcesz zachować wiersz z najniższym
id
wartość:DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
-
Jeśli chcesz zachować wiersz z najwyższym
id
wartość:DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
Użyłem tej metody w MySQL 5.1
Nie jestem pewien co do innych wersji.
Aktualizacja:ponieważ ludzie szukający w Google usuwania duplikatów trafiają tutaj
Chociaż pytanie OP dotyczy DELETE
, należy pamiętać, że przy użyciu INSERT
i DISTINCT
jest znacznie szybszy. W przypadku bazy danych z 8 milionami wierszy poniższe zapytanie zajęło 13 minut przy użyciu DELETE
, zajęło to ponad 2 godziny, a mimo to nie zostało ukończone.
INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
SELECT DISTINCT cellId,attributeId,entityRowId,value
FROM tableName;