No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de SQL y MySQL

Curso de SQL y MySQL

Genaro Bernardino

Genaro Bernardino

Automatización de Bases de Datos con Triggers en MySQL

9/19
Recursos

Los triggers en MySQL son una herramienta poderosa que permite automatizar acciones en respuesta a eventos específicos en nuestras bases de datos. Dominar esta funcionalidad nos abre un mundo de posibilidades para crear soluciones eficientes y elegantes, incluso implementando características que oficialmente no existen en MySQL, como las vistas materializadas. Veamos cómo podemos aprovechar al máximo esta capacidad para optimizar nuestras bases de datos.

¿Cómo crear una vista materializada en MySQL utilizando triggers?

Ya hemos explorado los triggers para el evento INSERT, que es el caso más sencillo conceptualmente. Ahora avanzaremos con los eventos DELETE y UPDATE, completando así nuestra implementación de una vista materializada en MySQL.

Para contextualizar, estamos trabajando con dos tablas: build_products (nuestra tabla original) y ventas_diarias_m (nuestra vista materializada). El objetivo es mantener automáticamente actualizada la tabla ventas_diarias_m con información agregada por fecha de build_products.

Implementando el trigger para DELETE

Cuando eliminamos un registro de build_products, necesitamos actualizar la información correspondiente en ventas_diarias_m. El trigger para manejar este evento se implementa así:

CREATE TRIGGER MathView_delete
AFTER DELETE ON build_products
FOR EACH ROW
BEGIN
    UPDATE ventas_diarias_m
    SET date = date(OLD.dateadd),
        count = (SELECT COUNT(*) FROM build_products WHERE date(dateadd) = date(OLD.dateadd)),
        total = (SELECT SUM(total) FROM build_products WHERE date(dateadd) = date(OLD.dateadd))
    WHERE date = date(OLD.dateadd);
END;

Es importante entender que en un trigger DELETE solo tenemos acceso a OLD, que representa la tupla que se está eliminando. La variable NEW no existe en este contexto porque no hay una nueva versión del registro.

Probemos este trigger con un ejemplo práctico:

  1. Identificamos un registro en build_products con una fecha específica
  2. Verificamos el estado actual de ventas_diarias_m para esa fecha
  3. Eliminamos el registro de build_products
  4. Comprobamos que ventas_diarias_m se ha actualizado correctamente

Implementando el trigger para UPDATE

El trigger para UPDATE es el más complejo porque debemos manejar dos escenarios:

  1. Cuando la fecha no cambia: Solo necesitamos actualizar los totales para esa fecha
  2. Cuando la fecha cambia: Debemos actualizar los registros tanto para la fecha antigua como para la nueva
CREATE TRIGGER MathView_update
AFTER UPDATE ON build_products
FOR EACH ROW
BEGIN
    IF date(NEW.dateadd) <> date(OLD.dateadd) THEN
        UPDATE ventas_diarias_m
        SET count = (SELECT COUNT(*) FROM build_products WHERE date(dateadd) = date(OLD.dateadd)),
            total = (SELECT SUM(total) FROM build_products WHERE date(dateadd) = date(OLD.dateadd))
        WHERE date = date(OLD.dateadd);
    END IF;
    
    UPDATE ventas_diarias_m
    SET count = (SELECT COUNT(*) FROM build_products WHERE date(dateadd) = date(NEW.dateadd)),
        total = (SELECT SUM(total) FROM build_products WHERE date(dateadd) = date(NEW.dateadd))
    WHERE date = date(NEW.dateadd);
END;

En un trigger UPDATE tenemos acceso tanto a OLD como a NEW, lo que nos permite comparar el estado anterior y el nuevo del registro.

¿Cómo probar nuestros triggers para garantizar su correcto funcionamiento?

Para verificar que nuestros triggers funcionan correctamente, debemos probar diferentes escenarios:

Escenario 1: Actualizar un registro sin cambiar la fecha

  1. Seleccionamos un registro específico (ID 167)
  2. Verificamos el estado actual de ventas_diarias_m para esa fecha
  3. Actualizamos el precio del producto
  4. Comprobamos que el conteo sigue igual pero el total ha cambiado
UPDATE build_products 
SET price = 1500 
WHERE build_product_id = 167;

Escenario 2: Actualizar un registro cambiando la fecha

  1. Seleccionamos el mismo registro (ID 167)
  2. Verificamos el estado actual de ventas_diarias_m para ambas fechas (origen y destino)
  3. Actualizamos la fecha del producto
  4. Comprobamos que los conteos y totales se han actualizado correctamente en ambas fechas
UPDATE build_products 
SET dateadd = '2024-04-08' 
WHERE build_product_id = 167;

¿Qué ventajas nos ofrece implementar vistas materializadas?

La potencia de esta implementación es inmensa. Estamos alterando una tabla y automáticamente representando estos cambios en otra tabla relacionada mediante un simple programa (trigger).

Las ventajas principales incluyen:

  • Mejora significativa del rendimiento: Podemos ahorrar 20-25 minutos de tiempo de consulta cada vez que necesitamos estos datos agregados
  • Datos siempre actualizados: La información se mantiene sincronizada automáticamente con cada modificación en la tabla original
  • Flexibilidad: Podemos adaptar esta estructura para casos tan simples o complejos como necesitemos

Mejorando la presentación de los resultados

Para mejorar la visualización de los datos, podemos utilizar la función FORMAT:

SELECT date, count, FORMAT(total, 2) 
FROM ventas_diarias_m;

Esta función nos permite formatear los números con separadores de miles y un número específico de decimales, aunque convierte el resultado a string.

Los triggers son herramientas poderosas que nos permiten implementar funcionalidades avanzadas en MySQL. Con ellos, hemos logrado crear una vista materializada completamente funcional a pesar de que oficialmente no existen en este sistema de gestión de bases de datos. ¿Has utilizado triggers para resolver algún problema específico en tus bases de datos? Comparte tu experiencia en los comentarios.

Aportes 0

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?