De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Removendo Duplicidades em MySQL

Colaboração: Marco Antonio Grecco Ribeiro

Data de Publicação: 30 de Setembro de 2006

Na infra-estrutura da UNIFESP - Universidade Federal de São Paulo (http://www.unifesp.br), utilizamos um servidor Linux/MySQL para suprir as necessidades de nossa comunidade quanto ao desenvolvimento de aplicações para a Web utilizando-se uma base de dados. Desta forma, muitas destas bases são criadas sem as devidas precauções e regulamentações propostas em diversas normas.

Nesta ultima semana enfrentamos um problema onde tivemos o esgotamento do espaço em disco da partição onde encontram-se as bases do MySQL. Isto acarretou na duplicação de todos os registros onde eram ausentes os índices, chaves primárias, campos únicos e afins.

O desespero tomou conta de nossa DBA, e a fim de mitigar o seu esforço em desenvolver diversos scripts para "limpar" as bases, utilizamos uma facilidade do MySQL para construir tabelas temporárias segundo um comando SQL.

No exemplo abaixo, temos a tabela chamada "danificada" com registros duplicados e a tabela "temp_danificada" onde colocarei os registros únicos, de acordo com a estrutura da tabela em questão :

CREATE TEMPORARY TABLE temp_danificada AS SELECT DISTINCT * FROM danificada

Com isto criamos a tabela temporária e podemos agora apagar os dados da tabela original :

DELETE FROM danificada;

E completando a operação, vamos reinserir os dados na tabela original :

INSERT INTO danificada(cod,nome) SELECT cod,nome FROM temp_danificada;

Estes comandos devem ser utilizados em sequência. Sugiro que seja montado um script SQL para executar uma só vez:

CREATE TEMPORARY TABLE temp_danificada AS SELECT DISTINCT * FROM danificada;
DELETE FROM danificada;
INSERT INTO danificada(cod,nome) SELECT cod,nome FROM temp_danificada;


Veja a relação completa dos artigos de Marco Antonio Grecco Ribeiro