ALTER EVENT
ALTER EVENT modifica la definición de un evento programado existente sin necesidad de eliminarlo y volver a crearlo. Puedes cambiar la programación, el cuerpo del evento, habilitarlo o deshabilitarlo, renombrarlo o modificar su política de conservación, todo con una sola sentencia.
En la práctica, ALTER EVENT es la herramienta que más usarás para gestionar eventos en producción. Un evento que creaste con CREATE EVENT rara vez permanece igual durante toda su vida útil: necesitarás ajustar la frecuencia de ejecución, corregir la lógica del cuerpo, deshabilitarlo temporalmente para una migración o reactivarlo tras una ventana de mantenimiento.
Sintaxis
La sintaxis completa de ALTER EVENT permite modificar cualquier aspecto de un evento existente:
ALTER
[DEFINER = usuario]
EVENT nombre_evento
[ON SCHEDULE programacion]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO nuevo_nombre]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'descripcion']
[DO cuerpo_evento]Todas las cláusulas son opcionales (excepto el nombre del evento), pero debes incluir al menos una. Puedes combinar varias cláusulas en una sola sentencia, lo que permite hacer cambios atómicos sin necesidad de ejecutar múltiples instrucciones.
Un detalle importante es que ALTER EVENT solo modifica las cláusulas que especificas. El resto de la definición permanece intacta. Por ejemplo, si cambias únicamente la programación, el cuerpo del evento sigue siendo el mismo. Esto simplifica los cambios parciales, ya que no necesitas reescribir toda la definición cada vez.
Cambiar la programación
El cambio más habitual es ajustar cuándo o con qué frecuencia se ejecuta un evento. Para ello, usas la cláusula ON SCHEDULE con la nueva programación, siguiendo la misma sintaxis que en CREATE EVENT.
Supongamos que creaste un evento de purga que se ejecuta cada hora, pero descubres que la carga es excesiva y necesitas reducir la frecuencia a cada 6 horas:
ALTER EVENT purgar_logs_antiguos
ON SCHEDULE EVERY 6 HOUR;MySQL actualiza la programación inmediatamente. La próxima ejecución se calculará a partir de ahora usando el nuevo intervalo. Si el evento tenía cláusulas STARTS y ENDS, se mantienen a menos que las cambies explícitamente.
También puedes convertir un evento recurrente en uno puntual, o viceversa. Por ejemplo, para que un evento que se ejecutaba periódicamente realice una última ejecución y se detenga:
ALTER EVENT recalcular_estadisticas
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 10 MINUTE;Ahora el evento se ejecutará una sola vez dentro de 10 minutos. Si quieres añadir o modificar las fechas de inicio y fin de un evento recurrente, incluye STARTS y ENDS dentro de la nueva programación:
ALTER EVENT generar_reportes
ON SCHEDULE EVERY 1 DAY
STARTS '2026-04-01 03:00:00'
ENDS '2026-12-31 23:59:59';Este cambio reprograma el evento para que se ejecute diariamente desde el 1 de abril hasta el 31 de diciembre. Si antes no tenía fecha de fin, ahora la tiene. Si ya tenía una, se reemplaza por la nueva.
Cambiar el cuerpo del evento
Para modificar las sentencias SQL que el evento ejecuta, usa la cláusula DO seguida del nuevo cuerpo. Esto es especialmente útil cuando necesitas corregir un error en la lógica o añadir nuevas operaciones.
Si el nuevo cuerpo es una sola sentencia, puedes escribirlo directamente:
ALTER EVENT limpiar_cache
DO
DELETE FROM cache_consultas WHERE creado < NOW() - INTERVAL 2 HOUR;Cuando el cuerpo necesita múltiples sentencias, usa BEGIN...END con el cambio de delimitador habitual:
DELIMITER //
ALTER EVENT resumen_diario_ventas
DO
BEGIN
DECLARE v_total DECIMAL(12,2);
SELECT COALESCE(SUM(total), 0) INTO v_total
FROM pedidos
WHERE DATE(fecha_pedido) = CURDATE() - INTERVAL 1 DAY
AND estado = 'completado';
INSERT INTO resumenes_diarios (fecha, total_ventas, fecha_generacion)
VALUES (CURDATE() - INTERVAL 1 DAY, v_total, NOW());
-- Nueva funcionalidad: registrar también el número de pedidos
UPDATE resumenes_diarios
SET total_pedidos = (
SELECT COUNT(*)
FROM pedidos
WHERE DATE(fecha_pedido) = CURDATE() - INTERVAL 1 DAY
AND estado = 'completado'
)
WHERE fecha = CURDATE() - INTERVAL 1 DAY;
END //
DELIMITER ;Observa que al cambiar el cuerpo, reemplazas toda la lógica del evento. No puedes añadir sentencias al cuerpo existente; debes proporcionar el cuerpo completo con todas las sentencias que quieras que se ejecuten.
Habilitar y deshabilitar eventos
Deshabilitar un evento temporalmente es mucho más seguro que eliminarlo. El evento permanece en la base de datos con toda su definición intacta, pero no se ejecuta. Cuando estés listo para reactivarlo, simplemente lo habilitas de nuevo.
-- Deshabilitar antes de una migración
ALTER EVENT purgar_logs_antiguos DISABLE;
-- Realizar la migración...
-- Reactivar cuando la migración ha terminado
ALTER EVENT purgar_logs_antiguos ENABLE;Este patrón es fundamental en operaciones de mantenimiento. Antes de ejecutar una migración que modifica el esquema de tablas que los eventos consultan, deshabilita todos los eventos relevantes. Si un evento se dispara mientras la tabla está en un estado intermedio, podrías perder datos o generar registros inconsistentes.
Para deshabilitar múltiples eventos a la vez, MySQL no ofrece una sentencia única, pero puedes encadenar varias instrucciones:
ALTER EVENT purgar_logs_antiguos DISABLE;
ALTER EVENT recalcular_estadisticas DISABLE;
ALTER EVENT resumen_diario_ventas DISABLE;Otra opción es deshabilitar el Event Scheduler completo en lugar de cada evento individual, pero esto afecta a todos los eventos de todas las bases de datos del servidor, lo que puede ser demasiado agresivo si otros equipos tienen eventos que necesitan seguir ejecutándose.
Renombrar un evento
La cláusula RENAME TO permite cambiar el nombre de un evento sin alterar ningún otro aspecto de su definición. Esto es útil cuando adoptas una nueva convención de nombres o cuando necesitas mover un evento a otra base de datos.
ALTER EVENT limpiar_cache
RENAME TO evt_purgar_cache_consultas;El renombrado es atómico: no hay un momento intermedio en el que el evento no exista. También puedes renombrar un evento moviéndolo a otra base de datos al incluir el nombre de base de datos como prefijo:
ALTER EVENT tienda.limpiar_cache
RENAME TO mantenimiento.evt_purgar_cache;Esto mueve la definición del evento de la base de datos tienda a la base de datos mantenimiento. Necesitas el privilegio EVENT en ambas bases de datos para que la operación se complete con éxito.
Cambiar ON COMPLETION
Si un evento se creó con ON COMPLETION NOT PRESERVE (el valor por defecto) y quieres que su definición se conserve tras finalizar, puedes cambiarlo:
ALTER EVENT auditoria_fin_de_mes
ON COMPLETION PRESERVE;Del mismo modo, si un evento tiene PRESERVE y decides que ya no necesitas conservar su definición una vez finalice:
ALTER EVENT auditoria_fin_de_mes
ON COMPLETION NOT PRESERVE;Este cambio es importante para eventos puntuales. Con NOT PRESERVE, un evento puntual que ya se ejecutó desaparecerá de la base de datos. Con PRESERVE, permanecerá con estado DISABLED, permitiéndote consultarlo o reactivarlo.
Combinar múltiples cambios
Una de las ventajas de ALTER EVENT es que puedes combinar varias modificaciones en una sola sentencia. Esto reduce el riesgo de que el evento se ejecute con una configuración inconsistente entre dos instrucciones separadas.
DELIMITER //
ALTER EVENT recalcular_estadisticas
ON SCHEDULE EVERY 30 MINUTE
STARTS '2026-04-01 00:00:00'
ENABLE
COMMENT 'Recalcula estadísticas de productos cada 30 minutos (actualizado abril 2026)'
DO
BEGIN
REPLACE INTO estadisticas_productos (
producto_id, total_ventas, cantidad_vendida,
valoracion_media, ultima_actualizacion
)
SELECT
p.id,
COALESCE(SUM(dp.subtotal), 0),
COALESCE(SUM(dp.cantidad), 0),
COALESCE(AVG(r.puntuacion), 0),
NOW()
FROM productos p
LEFT JOIN detalle_pedidos dp ON dp.producto_id = p.id
LEFT JOIN pedidos pe ON pe.id = dp.pedido_id AND pe.estado = 'completado'
LEFT JOIN resenas r ON r.producto_id = p.id AND r.aprobada = TRUE
GROUP BY p.id;
END //
DELIMITER ;Esta sentencia cambia la frecuencia a 30 minutos, establece una nueva fecha de inicio, habilita el evento, actualiza el comentario y reemplaza completamente el cuerpo con una versión mejorada que incluye la valoración media. Todo ocurre de forma atómica.
Modificar el DEFINER
En circunstancias especiales, puede ser necesario cambiar el usuario bajo cuyos privilegios se ejecuta el evento. Solo los usuarios con el privilegio SYSTEM_USER (o SUPER en versiones anteriores) pueden establecer un DEFINER diferente a su propio usuario.
ALTER DEFINER = 'admin_eventos'@'localhost'
EVENT recalcular_estadisticas;Esto es útil cuando el usuario que creó originalmente el evento ha sido eliminado o cuando necesitas que el evento acceda a recursos que requieren privilegios diferentes.
Errores comunes
El error más frecuente con ALTER EVENT es intentar modificar un evento que no existe. MySQL devuelve el error 1539 (Unknown event). A diferencia de CREATE EVENT, ALTER EVENT no admite la cláusula IF EXISTS, así que debes asegurarte de que el evento existe antes de modificarlo. Puedes verificarlo consultando information_schema.EVENTS o usando SHOW EVENTS.
Otro problema habitual es olvidar que al cambiar el cuerpo con DO, se reemplaza todo el contenido anterior. Si solo quieres añadir una sentencia al cuerpo existente, primero consulta la definición actual con SHOW CREATE EVENT nombre_evento, copia el cuerpo, haz los cambios y pásalo completo al ALTER EVENT.
SHOW CREATE EVENT purgar_logs_antiguos\GEl resultado incluye la sentencia CREATE EVENT completa, que puedes usar como base para construir tu ALTER EVENT.
Un tercer error es intentar habilitar un evento cuando el Event Scheduler está desactivado. La sentencia ALTER EVENT ... ENABLE se ejecuta sin error, pero el evento no se disparará hasta que actives el scheduler. Siempre verifica el estado del scheduler si un evento habilitado no parece ejecutarse.
Cuándo usar ALTER EVENT
Usa ALTER EVENT siempre que necesites modificar un evento existente sin perder su historial de ejecución ni arriesgarte a una ventana de tiempo sin cobertura. Si eliminas un evento con DROP EVENT y lo recreas inmediatamente con CREATE EVENT, existe un breve instante en el que el evento no existe, y si justo coincide con el momento de ejecución programado, se perderá esa ejecución. Con ALTER EVENT, la transición es atómica.
En flujos de despliegue automatizado, es habitual tener scripts que usen ALTER EVENT para actualizar la lógica de eventos existentes tras cada despliegue, de forma similar a cómo se ejecutan migraciones de esquema. Esto garantiza que los eventos siempre reflejen la versión más reciente del código sin interrupciones.
Escrito por Eduardo Lázaro
