Aviso do editor:esta solução é computacionalmente ineficiente e pode derrubar sua conexão para uma tabela grande.
NB - Você precisa para fazer isso primeiro em uma cópia de teste da sua mesa!
Quando fiz isso, descobri que, a menos que também incluísse
AND n1.id <> n2.id
, ele excluiu todas as linhas da tabela. -
Se você quiser manter a linha com o menorid
valor:
DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
-
Se você quiser manter a linha com oid
mais alto valor:
DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
Eu usei este método no MySQL 5.1
Não tenho certeza sobre outras versões.
Atualização:como as pessoas que pesquisam no Google para remover duplicatas acabam aqui
Embora a pergunta do OP seja sobre
DELETE
, saiba que usar INSERT
e DISTINCT
é muito mais rápido. Para um banco de dados com 8 milhões de linhas, a consulta abaixo levou 13 minutos, usando DELETE
, demorou mais de 2 horas e ainda não foi concluído. INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
SELECT DISTINCT cellId,attributeId,entityRowId,value
FROM tableName;