jueves, septiembre 10, 2009

Eliminando registros duplicados en Postgres

Nota: Cero relevancia para el lector casual.

El problema:
Hay una tabla que a pesar de haber sido pensada para soportar registros con similar información, la práctica demostró que los registros eran exactamente los mismos y se deben eliminar los duplicados sin alterar la estructura de la tabla.

Posteriormente a solucionar el problema, lo recomendable es agregar un índice único que efectivamente sirva a nuestra necesidad.

Por cierto, la solución sólo aplica si la tabla tiene una columna que permite diferenciar 2 registros "similares", en mi caso esta es la columna fecha, que corresponde a la fecha en que se generó el registro ( now() ).

La solución:
  1. Hacerse una idea de cuantos registros están duplicados:
    SELECT identificador, COUNT(*) AS c
    FROM mitabla
    GROUP BY identificador
    HAVING COUNT(*) > 1
  2. Eliminar los registros duplicados:
    DELETE FROM mitabla
    WHERE fecha NOT IN
    (SELECT MIN(fecha)
    FROM mitabla
    GROUP BY identificador
    HAVING COUNT(*) >= 1)
Se debe tener en consideración que el proceso puede ser muy lento, todo dependerá de cuantos registros haya en la tabla.

No hay comentarios.: