En una Base de Datos bien diseñada nunca deberían existir filas duplicadas (o triplicadas, o cuadruplicadas, o…) pero a veces algo así sucede y debemos en primer lugar encontrar el motivo o la causa que las permitió y en segundo lugar eliminarlas.

¿Por qué hay que eliminarlas?

Porque si están duplicadas están sobrando, están de más, están aunque no deberían estar, y el tenerlas dentro de la Base de Datos solamente nos puede causar problemas y ningún beneficio: los informes tendrán más filas de las que deberían tener, los totales serán mayores a los reales, etc.

 ¿Y por qué causa tenemos filas duplicadas?

Si nuestra Base de Datos está bien diseñada sería imposible que tal cosa ocurra si los usuarios introducen los datos manualmente pero a veces los datos provienen de fuentes externas como un archivo de texto, una planilla Excel, una tabla .DBF, etc.

Y si está mal diseñada permitirá filas duplicadas. Un caso insidioso puede ocurrir cuando tenemos dos o más formularios que se utilizan para introducir datos en las tablas. Por ejemplo, una aplicación de Contabilidad tiene un módulo de Clientes y otra aplicación de Facturación también tiene un módulo de Clientes. Los usuarios pueden introducir datos de los clientes tanto desde la Contabilidad como desde la Facturación, algo así puede ser problemático de solucionar, con mayor razón cuando los programadores de ambas aplicaciones son distintas personas.

Y es en esos casos, en los cuales no tuvimos control cuando se insertaron las filas (porque provienen de un archivo de texto, una planilla Excel, una tabla .DBF, etc), o nuestro control fue mediocre, en que debemos verificar cuidadosamente que no existan filas duplicadas.

 Problemas que causan las filas duplicadas

  1. Los cálculos son incorrectos porque algunas filas son contadas más de una vez y deberían contarse una sola vez. Por lo tanto los informes serán incorrectos.
  2. Pueden existir datos incompletos en una fila, porque están en otra fila
  3. La velocidad de las operaciones en la Base de Datos (insertar, modificar, borrar, consultar) disminuye porque cuanto más grande es una Base de Datos más lentas son esas operaciones. Si hay filas duplicadas el tamaño de la Base de Datos será mayor que el necesario y por lo tanto las operaciones serán más lentas de lo que deberían ser
  4. Eliminar las filas duplicadas toma tiempo, no es algo instantáneo, y el personal desperdicia ese tiempo en encontrar y eliminar las filas duplicadas en lugar de dedicarlo a algo más importante

¿Cómo encontrar filas duplicadas?

Para estos casos lo mejor es crear un stored procedure seleccionable que se dedique a esa tarea, dicho stored procedure es muy sencillo, simplemente tendrá un FOR SELECT por cada tabla que nos interesa, algo como:

CREATE PROCEDURE SP_ENCONTRANDO_DUPLICADOS
   RETURNS(
      ftcNombre VARCHAR(255))
AS
   DECLARE VARIABLE lnCantidad INTEGER;
BEGIN

   FOR SELECT
      DEP_NOMBRE,
      COUNT(*)
   FROM
      DEPARTAMENTOS
   GROUP BY
      DEP_NOMBRE
   HAVING
      COUNT(*) > 1
   INTO
      :ftcNombre,
      :lnCantidad
   DO BEGIN
      SUSPEND;
   END

END;

Aquí hay una sola tabla, llamada DEPARTAMENTOS, y lo que se verifica es si el nombre de algún departamento está duplicado. Si ese es el caso entonces la condición COUNT(*) > 1 será verdadera y el nombre del Departamento será mostrado.

Un stored procedure más completo tendría varios FOR SELECT, uno por cada tabla que nos interesa verificar.

Lo importante a recordar es que no debemos permitir jamás, por ningún motivo, y bajo ninguna circunstancia, que en nuestras tablas existan filas duplicadas, porque si existen eso solamente podrá acarrearnos problemas.

Artículos relacionados:

Averiguando si hay datos duplicados

El índice del blog Firebird21

El foro del blog Firebird21

Anuncios