Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Excluir todas as linhas duplicadas, exceto uma no MySQL?


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.

  1. Se você quiser manter a linha com o menor id valor:
    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
    

  2. Se você quiser manter a linha com o id 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;