Deletando registros duplicados no banco de dados

Fazendo um script para apagar entradas duplicadas no MySQL.

por George Moura 09/01/2014

Precisei fazer a migração de dados de algumas tabelas de cadastro (telefones, hobbies, interesses, formações e etc.) para uma única tabela diferenciando-os pelo id do usuário e o id do campo. O problema é que meu script acabou duplicando as informações. Para a minha sorte isso aconteceu em um banco de desenvolvimento, onde era possível apagar os dados da tabela, ajustar os scripts e refazer a migração. Eu não queria ter esse trabalho novamente e logo resolvi pesquisar um script sql que me ajudasse a apagar os registros duplicados, nesse caso deixando apenas o último registro gravado.

Assumindo que você use o banco de dados MySql e tenha uma tabela chamada “nomes”, e que essa tabela tenha os campos id e nome. Essa sintaxe pode ser usada em outros bancos, utilizaremos o seguinte comando:

DELETE a FROM nomes AS a, nomes AS b WHERE a.nome=b.nome AND a.id < b.id

Perceba que no comando sql após o FROM eu chamo duas vezes a tabela “nomes”, mas as diferencio pelas letras a e b. Você poderia dar o nome que quisesse. Note também que depois do WHERE eu faço a comparação entre as colunas, verificando a duplicidade e depois digo que o id de “a” deve ser menor que o de “b”. Dessa forma o MySql vai comparar todos os registros com o mesmo nome e apagar aqueles que contenham o menor id.

nomes: É a tabela com os registros duplicados.

nome: É o campo para comparação dos registros.

id: É a chave primária da tabela.

Veja na prática como acontece:

Tabelas com os registros duplicados

tableless-select-mysql

Aplicando o script descrito acima:

tableless-mysql-script-delete

Caso queira apagar todos os registros duplicados, deixando apenas os registros únicos é só trocar o “<” por “!=”

veja um exemplo:

tableless-mysql-script-deletall

Pronto! É isso aí pessoal, muito simples né?