Предупреждение на редактора:Това решение е изчислително неефективно и може да развали връзката ви за голяма маса.
NB – Вие необходим за да направите това първо на тестово копие на вашата маса!
Когато го направих, установих, че освен ако не включих също AND n1.id <> n2.id
, той изтри всеки ред в таблицата.
-
Ако искате да запазите реда с най-ниския
id
стойност:DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
-
Ако искате да запазите реда с най-висок
id
стойност:DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
Използвах този метод в MySQL 5.1
Не съм сигурен за други версии.
Актуализация:Тъй като хората, търсещи в Google за премахване на дубликати, се озовават тук
Въпреки че въпросът на ОП е за DELETE
, имайте предвид, че използвате INSERT
и DISTINCT
е много по-бързо. За база данни с 8 милиона реда заявката по-долу отне 13 минути, докато се използва DELETE
, отне повече от 2 часа и все пак не завърши.
INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
SELECT DISTINCT cellId,attributeId,entityRowId,value
FROM tableName;