Triggers en MySQL: BEFORE, AFTER, INSERT, UPDATE y DELETE con ejemplos


Un trigger es una acción automática que MySQL ejecuta cuando ocurre un evento sobre una tabla.

¿Qué problema resuelve?

Permite ejecutar lógica automáticamente ante inserciones, modificaciones o eliminaciones, incluso si la operación proviene de distintas aplicaciones.

¿Cuándo conviene un trigger?

Un trigger es útil cuando una regla debe ejecutarse automáticamente sin importar qué aplicación haya realizado el cambio.

Ejemplos típicos:

  • registrar auditorías;
  • guardar históricos;
  • validar ciertas condiciones;
  • mantener datos derivados muy controlados.

La contrapartida es que la lógica queda “oculta” detrás de la operación principal, por eso conviene usarlos con criterio.

Eventos disponibles

  • INSERT
  • UPDATE
  • DELETE

BEFORE y AFTER

  • BEFORE: antes del cambio.
  • AFTER: después de que el cambio fue realizado.

Qué valores existen en cada evento

No siempre están disponibles OLD y NEW:

  • INSERT: existe NEW;
  • UPDATE: existen OLD y NEW;
  • DELETE: existe OLD.

NEW

NEW representa los valores nuevos de la fila.

En un BEFORE INSERT o BEFORE UPDATE incluso podemos modificar ciertos valores de NEW antes de que se guarden.

OLD

OLD representa los valores anteriores.

Es especialmente útil para auditorías porque permite comparar qué tenía una columna antes y qué tendrá después.

BEFORE INSERT

DELIMITER //
CREATE TRIGGER trg_productos_stock_insert
BEFORE INSERT ON productos
FOR EACH ROW
BEGIN
    IF NEW.stock < 0 THEN
        SET NEW.stock = 0;
    END IF;
END //
DELIMITER ;

BEFORE INSERT: corregir o rechazar

En el ejemplo anterior elegimos corregir un stock negativo y transformarlo en cero. En otros casos puede ser mejor rechazar la operación con SIGNAL.

Corregir silenciosamente y bloquear con error son decisiones distintas de negocio.

BEFORE UPDATE

Sirve para validar o transformar los nuevos valores antes de guardarlos.

Comparar OLD y NEW

IF OLD.precio <> NEW.precio THEN
    INSERT INTO precios_auditoria(producto_id, precio_anterior, precio_nuevo)
    VALUES(NEW.id, OLD.precio, NEW.precio);
END IF;

Auditoría con OLD y NEW

Si queremos registrar cambios de precio, podemos guardar ambos valores en una tabla de auditoría. Así queda trazabilidad de qué cambió.

AFTER INSERT

Es útil para auditorías o acciones posteriores al alta.

En AFTER el cambio principal ya ocurrió, por lo que se usa normalmente para registrar consecuencias, no para modificar el valor que se está insertando.

BEFORE DELETE

Podemos guardar un registro histórico antes de eliminar la fila.

SIGNAL

Permite generar un error y bloquear una operación inválida.

IF NEW.stock < 0 THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'El stock no puede ser negativo';
END IF;

FOR EACH ROW

Un trigger se ejecuta una vez por cada fila afectada. Si un UPDATE modifica 10.000 filas, el trigger puede ejecutarse 10.000 veces.

Ver triggers

SHOW TRIGGERS;

Eliminar trigger

DROP TRIGGER IF EXISTS trg_productos_stock_insert;

Triggers dentro de transacciones

Las operaciones que ejecuta un trigger forman parte del mismo contexto transaccional de la sentencia que lo disparó. Si la operación principal se revierte, sus efectos asociados también pueden revertirse según el motor y las tablas involucradas.

Trigger o restricción

Si una regla puede resolverse con NOT NULL, UNIQUE, CHECK o FOREIGN KEY, normalmente esas opciones son más simples y explícitas.

El problema de la lógica oculta

Una sentencia UPDATE puede aparentar modificar una tabla, pero un trigger podría generar efectos adicionales. Por eso deben documentarse bien.

Errores comunes

  • usar triggers para todo;
  • crear efectos secundarios difíciles de detectar;
  • ignorar el costo por fila;
  • duplicar reglas que ya existen como restricciones.

Ejercicios

  1. impedir precios negativos;
  2. registrar cambios de precio;
  3. guardar filas antes de DELETE;
  4. crear historial de stock.

¿Qué sigue?

Normalización de bases de datos.

¿Te sirvió esta guía? ☕

Si este contenido te ayudó y querés apoyar a Club Programador para seguir publicando ejercicios, proyectos y guías gratuitas, podés colaborar mediante:

☕ Apoyar con Mercado Pago

🌎 Apoyar con PayPal


Ruta SQL / MySQL

Ver todos los contenidos de SQL / MySQL

← Funciones almacenadas

Normalización de bases de datos →


Descubre más desde Club Programador

Suscríbete y recibe las últimas entradas en tu correo electrónico.

2 opiniones en “Triggers en MySQL: BEFORE, AFTER, INSERT, UPDATE y DELETE con ejemplos”

Deja un comentario

Descubre más desde Club Programador

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo