Primero: no borres nada hasta saber qué está duplicado
Uno de los errores más habituales trabajando con bases de datos es ver filas repetidas y lanzar un DELETE directamente. Parece lógico, pero es justo lo que no debes hacer.
Un registro duplicado puede ser un error, pero también puede ser información válida. Por ejemplo, un cliente puede tener varios pedidos, varias facturas o varios contactos asociados.
Antes de tocar la tabla necesitas responder a una pregunta: ¿qué significa exactamente que algo esté duplicado?
Encontrar duplicados con GROUP BY
La herramienta principal para detectar duplicados es combinar GROUP BY con COUNT().
SELECT email,
COUNT(*) AS cantidad
FROM clientes
GROUP BY email
HAVING COUNT(*) > 1; Esta consulta agrupa todos los clientes por email y muestra aquellos que aparecen más de una vez.
Por ejemplo, si el email cliente@email.com aparece tres veces, SQL devolverá ese registro indicando que existe una repetición.
Buscar duplicados con varias columnas
Muchas veces un duplicado no depende de una única columna. Puede ser la combinación de nombre y fecha, producto y proveedor o código y categoría.
SELECT nombre_producto,
proveedor,
COUNT(*) AS total
FROM productos
GROUP BY nombre_producto, proveedor
HAVING COUNT(*) > 1; Aquí SQL busca filas donde coincidan ambas columnas. Esto es mucho más fiable que mirar solo un campo.
Ver las filas completas antes de eliminar
Una vez detectados los duplicados, el siguiente paso es ver exactamente qué filas son.
SELECT *
FROM clientes
WHERE email IN (
SELECT email
FROM clientes
GROUP BY email
HAVING COUNT(*) > 1
); Ahora tienes todos los registros implicados y puedes decidir cuál conservar.
Eliminar duplicados de forma segura
Aquí viene la parte delicada. No existe un botón mágico que diga "borra duplicados correctos". Normalmente necesitas identificar cuál es la fila que quieres mantener.
Una práctica habitual es conservar el registro con el identificador más antiguo y eliminar los demás.
DELETE FROM clientes
WHERE id_cliente NOT IN (
SELECT MIN(id_cliente)
FROM clientes
GROUP BY email
); La idea es sencilla: para cada email conserva el ID más pequeño y elimina el resto.
Pero cuidado: esta consulta depende mucho de la estructura de tu tabla. Antes de ejecutarla en producción, pruébala siempre con un SELECT.
La técnica profesional: comprobar primero con SELECT
Cambia temporalmente el DELETE por un SELECT:
SELECT *
FROM clientes
WHERE id_cliente NOT IN (
SELECT MIN(id_cliente)
FROM clientes
GROUP BY email
); Si los resultados son exactamente los que esperas, entonces puedes transformar esa lógica en un DELETE.
Errores comunes al eliminar duplicados
- Borrar directamente sin hacer una copia o sin revisar primero los registros afectados.
- Pensar que dos filas iguales visualmente siempre son duplicados. Puede haber diferencias ocultas en otros campos.
- Eliminar usando una columna incorrecta. Un nombre repetido no significa necesariamente un cliente repetido.
- No tener en cuenta claves relacionadas. Borrar un cliente puede romper pedidos o facturas asociadas.
- Probar consultas DELETE directamente en producción sin validar antes.
Una forma más segura de trabajar
Cuando limpies datos importantes, trabaja siempre en tres pasos:
- Detecta duplicados con GROUP BY y HAVING.
- Revisa manualmente los registros encontrados.
- Ejecuta el borrado dentro de una transacción si tu base de datos lo permite.
Así, si algo sale mal, puedes deshacer los cambios antes de dejarlos definitivos.
Pro Tip
Antes de ejecutar cualquier DELETE importante, ejecuta un SELECT COUNT(*) con la misma condición para saber cuántas filas vas a afectar. Otro truco útil es guardar la consulta original en un archivo antes de modificarla. En muchos editores SQL puedes usar Ctrl + Z para recuperar cambios mientras estás probando.