Introduccion
Con el tiempo, una tienda PrestaShop puede acumular registros duplicados por errores de importación, fallos en módulos, migraciones mal hechas o integraciones de terceros. Estos duplicados pueden generar problemas como productos repetidos, categorías replicadas, combinaciones inconsistentes y errores en pedidos.
En este artículo aprenderás cómo detectar y eliminar registros duplicados en PrestaShop directamente desde la base de datos, usando consultas MySQL específicas y seguras para cada tipo de entidad.
Índice
Introducción 1. ¿Por qué aparecen registros duplicados en PrestaShop? 2. Identificar duplicados en productos 3. Detección y limpieza de combinaciones repetidas 4. Categorías duplicadas: cómo gestionarlas 5. Comprobación en clientes o direcciones repetidas 6. Cómo eliminar duplicados de forma segura 7. Automatización y validaciones 8. Comparativa: SQL manual vs módulos de limpieza Conclusión- ¿Por qué aparecen registros duplicados en PrestaShop?
Causa | Ejemplo |
🧾 Importaciones CSV repetidas | Productos importados varias veces por error |
🔁 Migraciones incompletas | Combinaciones duplicadas sin asignación correcta |
🔌 Módulos de terceros defectuosos | Creación de direcciones duplicadas |
👥 Registro de clientes sin validación | Cuentas similares con mismo email |
Identificar estas situaciones a tiempo ayuda a mantener integridad en el catálogo y evitar errores funcionales.
- Identificar duplicados en productos
Puedes detectar productos con la misma referencia:
SELECT reference, COUNT(*) c FROM ps_product WHERE reference IS NOT NULL AND reference != '' GROUP BY reference HAVING c > 1; Para eliminar uno de los duplicados: DELETE FROM ps_product WHERE id_product IN ( SELECT id_product FROM ( SELECT id_product FROM ps_product WHERE reference = 'DUPLICADA-123' ORDER BY id_product DESC LIMIT 1 OFFSET 1 ) AS sub );
- Detección y limpieza de combinaciones repetidas
En ps_product_attribute puede haber combinaciones duplicadas:
SELECT id_product, GROUP_CONCAT(id_product_attribute) AS attrs, COUNT(*) c
FROM ps_product_attribute
GROUP BY id_product, id_product_attribute
HAVING c > 1;
Para eliminarlas:
DELETE pa FROM ps_product_attribute pa JOIN ( SELECT MIN(id_product_attribute) keep_id, id_product FROM ps_product_attribute GROUP BY id_product, id_product_attribute ) to_keep ON pa.id_product = to_keep.id_product AND pa.id_product_attribute != to_keep.keep_id;
- Categorías duplicadas: cómo gestionarlas
Verifica si hay categorías con el mismo nombre y nivel:
SELECT name, COUNT(*) FROM ps_category_lang GROUP BY name HAVING COUNT(*) > 1;
Valida el id_category asociado y elimina los registros innecesarios o reasigna productos con:
UPDATE ps_category_product SET id_category = NUEVA_ID WHERE id_category = ID_DOBLE;
Y luego:
DELETE FROM ps_category WHERE id_category = ID_DOBLE;
- Comprobación en clientes o direcciones repetidas
Clientes con mismo email:
SELECT email, COUNT(*) FROM ps_customer GROUP BY email HAVING COUNT(*) > 1;
Direcciones con misma info:
SELECT id_customer, alias, COUNT(*) FROM ps_address GROUP BY id_customer, alias HAVING COUNT(*) > 1;
- Cómo eliminar duplicados de forma segura
- 🔒 Haz una copia de seguridad de la base de datos
- Ejecuta primero consultas SELECT para confirmar duplicados
- Usa subconsultas o LIMIT para evitar eliminar todo
- Actualiza referencias relacionadas si haces un DELETE
Ejemplo de flujo seguro:
— Verificamos duplicados
SELECT reference FROM ps_product GROUP BY reference HAVING COUNT(*) > 1;
— Elegimos qué ID conservar y borramos el resto
DELETE FROM ps_product WHERE id_product = ID_A_ELIMINAR;
- Automatización y validaciones
Puedes crear scripts que ejecuten validaciones semanales:
$result = Db::getInstance()->executeS('SELECT email, COUNT(*) c FROM ps_customer GROUP BY email HAVING c > 1'); foreach ($result as $r) { echo 'Duplicado: '.$r['email']."\n"; }
O integrarlo en tu dashboard personalizado con alarmas de duplicados.
- Comparativa: SQL manual vs módulos de limpieza
Método | Ventajas | Desventajas |
SQL manual | Gratuito, control completo, auditable | Requiere conocimiento técnico |
Módulos del Marketplace | Fácil uso, interfaz amigable | Coste y menos flexibilidad |
Validación por PHP | Integrable con paneles propios | Desarrollo personalizado necesario |
Conclusión
Detectar y eliminar duplicados en PrestaShop es una tarea crítica para mantener la salud del catálogo, integridad de pedidos y rendimiento general. Aunque existen módulos para ello, usar SQL directamente te da un control más preciso, especialmente si entiendes la estructura interna del sistema.
Hazlo con precaución, revisa siempre con SELECT antes de eliminar y documenta las operaciones si trabajas en equipo o para clientes.