Consultas y Transformación Avanzada de Datos
Diseño y Optimización Avanzada de Bases de Datos con SQL y MySQL
Construcción de Base de Datos en MySQL: Terminal, Tablas y Datos Simulados
Transformación de Datos con SQL: De Consultas Simples a Superqueries
Columnas Generadas en SQL
Expresiones Regulares y Slugs en SQL y MySQL: Casos de Uso Reales
Automatización, Reutilización y Eficiencia en Consultas
Vistas y Tablas Virtuales en SQL
Consultas Anidadas y Vistas Materializadas
Triggers y Vistas Materializadas en MySQL (Kinda)
Automatización de Bases de Datos con Triggers en MySQL
Llaves Primarias e Índices
Trabajo con Datos Avanzados (JSON)
Uso de JSON en MySQL: Almacenamiento Eficiente de Datos Estructurados
Búsquedas Avanzadas con JSON en MySQL: Indexación y Optimización
Joins en SQL: Conecta Tablas y Mejora tus Consultas
Motores de Almacenamiento y Encodings
Gestión de Usuarios y Permisos en SQL
Gestión Avanzada y Análisis de Bases de Datos
Information Schema en MySQL: Análisis Interno de tu Base de Datos
Mysqldump
Domina las Migrations: Evoluciona y Gestiona tu Base de Datos con Eficiencia
Optimiza tus Decisiones con Metabase
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
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.
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
.
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:
build_products
con una fecha específicaventas_diarias_m
para esa fechabuild_products
ventas_diarias_m
se ha actualizado correctamenteEl trigger para UPDATE es el más complejo porque debemos manejar dos escenarios:
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.
Para verificar que nuestros triggers funcionan correctamente, debemos probar diferentes escenarios:
ventas_diarias_m
para esa fechaUPDATE build_products
SET price = 1500
WHERE build_product_id = 167;
ventas_diarias_m
para ambas fechas (origen y destino)UPDATE build_products
SET dateadd = '2024-04-08'
WHERE build_product_id = 167;
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:
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
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?