MySQL: Como apagar registros duplicados e manter apenas um

A um tempo atrás tive problema num sistema que estava inserindo registros duplicados no banco e o relatório estava dando números completamente descabidos.
Além de resolver o bug no sistema tive de deletar as duplicatas, deixando apenas um registro.
Como fazer isso direto no MySQL sem ter que fazer um script que iria demorar um bom tempo para rodar, levando em conta o número de registros?

Pesquisando aqui e ali achei este artigo que apresenta várias consultas diferentes para resolver esse problema.
Criar tabelas temporárias e copiar os registros para a original, subselects e outras que vale apena ler para aprender.
Mas nessa dica vou mostrar apenas a query que eu usei, que é “curta e grossa” e a que julguei dar menos trabalho.

Mãos a obra

A tabela é simples, nomes de pessoas. Vamos inserir nomes repetidos para demonstrar o uso da query:

CREATE TABLE `pessoas`(
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `nome` VARCHAR(20) NOT NULL
);
INSERT INTO `pessoas` (`nome`)
    VALUES ('Josiel'), ('Maria'), ('Josiel'), ('Beatriz'), ('João'), ('Maria'), ('Lucia'), ('João');

Apagando os registros duplicados baseado no nome

A query que eu usei para apagar as duplicatas foi:

DELETE p1 FROM `pessoas` AS p1, `pessoas` AS p2
    WHERE p1.`id`<p2.`id` AND p1.`nome`=p2.`nome`;

Na query acima 3 registros foram apagados. Os duplicados foram removidos, deixando apenas o último.
Caso queira remover todos deixando o primeiro, basta trocar p1.id<p2.id por p1.id>p2.id.

Essa query pode ser usada também para fazer deleções em mais de uma tabela. Mas deixemos isso pra lá nesse post.
Você pode obter o mesmo resultado com a query abaixo, que faz a mesma coisa que a anterior só que é mais verbosa:

DELETE p1 FROM `pessoas` AS p1 INNER JOIN `pessoas` AS p2
    WHERE p1.`id`<p2.`id` AND p1.`nome`=p2.`nome`;

Fim

Bom, é isso.
Recomendo muito a leitura do artigo que encontrei e também a sintaxe do comando DELETE no MySQL para ver outras queries e entender como as coisas funcionam.

Espero que esse post tenha sido útil e qualquer dúvida, erro, sugestão ou elogio deixe aí nos comentários.
Até a próxima!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *