Removendo registros duplicados no MySQL 5.7


Veja como resolver esse problema nas novas versões do MySQL.


Uma das formas mais utilizadas e (ao meu ver) mais eficiente para remover registros duplicados no MySQL antes da versão 5.7, era adicionando uma restrição em algum campo de uma tabela para que esse valor fosse “único”, ou seja, nessa tabela não poderiam haver dois valores iguais.
Isso era feito de forma simples, conforme o exemplo do comando abaixo :

ALTER IGNORE TABLE nome_da_tabela ADD UNIQUE INDEX titulo_do_indice(nome_do_campo);

Quando esse comando era executado no banco, por termos adicionado a palavra “IGNORE” na instrução SQL,
o banco fazia uma varredura na tabela e removia todos os registros duplicados na mesma.

Porém, na versão 5.7 do banco, a respectiva instrução (ALTER IGNORE TABLE) foi “depreciada”, ou se preferir, removida, e assim essa opção não funciona mais.
Então, se você fizer uma busca pela internet a esse respeito, vai encontrar vários artigos ensinando a remover a duplicidade da seguinte forma :

DELETE t1 FROM nome_da_tabela t1, nome_da_tabela t2 WHERE t1.id > t2.id AND t1.nome_campo_repetido = t2.nome_campo_repetido

Ou seja, esse comando compara o valor de uma campo com todos os outros existentes na tabela, e prioriza o último registro inserido no banco, em outras palavras, o id maior fica, os primeiros serão excluídos. O problema dessa última abordagem, é que se o banco for grande isso vai demorar uma eternidade pra terminar, logo se torna uma opção inviável.
Temos então, uma nova forma para resolver esse problema, e claro, de forma mais rápida e eficiente.

O primeiro passo, é criarmos uma tabela com a estrutura idêntica da tabela que queremos excluir as duplicidades, e isso pode ser feito através do seguinte comando:

CREATE TABLE nome_da_tabela_copia LIKE nome_da_tabela_original;

Uma nova tabela foi criada, e agora, nós vamos adicionar a ela um índice (UNIQUE) no campo que queremos que seja único no banco. O comando pra isso é o seguinte :

ALTER TABLE nome_da_tabela_copia ADD UNIQUE(nome_do_campo);

Com isso, a partir de agora essa tabela não irá permitir que valores repetidos nesse campo sejam inseridos.

Agora vamos trazer os registro da tabela original para essa, mas sem as duplicidades, e faremos isso com o comando :

INSERT IGNORE INTO nome_da_tabela_copia SELECT * FROM nome_da_tabela_original;

A partir de agora temos a nova tabela completamente limpa dos registros duplicados, e podemos então, renomear essa nova tabela utilizada no lugar da tabela original.

RENAME TABLE nome_da_tabela_original TO tabela_antiga, nome_da_tabela_copia TO nome_da_tabela_original;

Por fim, vamos remover a tabela antiga que não está mais nos servindo pra nada :

DROP TABLE tabela_antiga;

Pronto, problema resolvido. Abração.

Deixe uma resposta

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