Removendo Duplicidades em MySQL

Started by insanity, 30 de September , 2006, 03:00:16 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

insanity

Removendo Duplicidades em MySQL
 ===============================

by: Marco Antonio Grecco Ribeiro

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;