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;