martes, 16 de agosto de 2011

Borrando Registros Duplicados MySql - dejando solo un registro válido -

Amigos,
El borrado de data de tablas MySQL es un poco particular ya esta BD no permite el uso de subconsultas para Update o Delete, con lo cual nuestra query de costumbre para Sql Server devuelve un error

-------------------------------------------------------------------------
-- Detalle: Este script permite borrar registros duplicados Sql Server --
-- Autor: Gustavo Herrera --
-------------------------------------------------------------------------
-- 1) Agrego un campo "id" identity (si no lo tiene)
Alter Table TablaX
add id integer identity

-- 2) Borro registros duplicados
Delete from TablaX
where Id > (Select min(Id) From TablaX as b Where TablaX.Idmsg = b.Idmsg)

-- 3) Dropeo el campo creado para correr el paso 2
Alter Table TablaX
Drop Column id

Con el problema “encima”, me dediqué a buscar algo que me permitiese borrar los registros (no a mano claro).

Luego de muuuucho buscar encontré algo que el MySql tiene bien escondido o al menos no lo suficientemente documentado.

Se trata de una cláusula que, al ser agregada a la creación de un índice unique en el MySql, deja soló uno de los registros duplicados borrando al resto.

La clásula oculta se llama IGNORE y esta es la sentencia:

ALTER IGNORE TABLE `Nombre Tabla`
ADD UNIQUE INDEX IxUnique_Globalid_Direction (campo1,campo2);

Grandes problemas, pequeñas pero efectivas soluciones amigos...,de lo contrario no les quedará otra más que crear una tabla temporal y copiar hacia allí los registros "buenos" para luego borrar la tabla anterior (algo sumamente engorroso y que requiere de un downtime considerable)

Espero que les sirva, saludos.

2 comentarios:

  1. No se como llegue hasta aquí pero debo decir que este código que usted muy amablemente ha compartido es una joya.

    Muchas gracias.

    Eduardo

    ResponderEliminar