DROP EVENT

DROP EVENT elimina permanentemente un evento programado de la base de datos. Una vez ejecutada la sentencia, la definición del evento desaparece por completo: se cancela cualquier ejecución futura pendiente y no queda rastro del evento en el catálogo del sistema.

Eliminar un evento es una operación irreversible. A diferencia de deshabilitar un evento con ALTER EVENT ... DISABLE, que conserva la definición para poder reactivarla más adelante, DROP EVENT borra toda la información asociada al evento. Si descubres que necesitabas ese evento después de eliminarlo, tendrás que volver a crearlo desde cero con CREATE EVENT.

Sintaxis

La sintaxis de DROP EVENT es directa y sencilla:

DROP EVENT [IF EXISTS] nombre_evento;

Solo necesitas especificar el nombre del evento que quieres eliminar. Si el evento pertenece a una base de datos diferente de la actual, incluye el nombre de la base de datos como prefijo:

DROP EVENT tienda.purgar_logs_antiguos;

La sentencia se ejecuta de forma inmediata. Si el evento estaba en medio de una ejecución en ese preciso momento, la ejecución en curso se completa, pero no habrá ejecuciones futuras. MySQL no interrumpe una ejecución activa al eliminar el evento.

IF EXISTS

Sin IF EXISTS, intentar eliminar un evento que no existe genera el error 1539 (Unknown event). Esto puede ser problemático en scripts de migración o despliegue que necesitan ser idempotentes, es decir, que puedan ejecutarse varias veces sin provocar errores.

-- Sin IF EXISTS: falla si el evento no existe
DROP EVENT purgar_logs_antiguos;
-- Error 1539: Unknown event 'purgar_logs_antiguos'
 
-- Con IF EXISTS: no falla, solo emite un warning
DROP EVENT IF EXISTS purgar_logs_antiguos;

Con IF EXISTS, MySQL comprueba si el evento existe antes de intentar eliminarlo. Si existe, lo elimina normalmente. Si no existe, la sentencia se completa sin error, generando únicamente un aviso (warning) que puedes consultar con SHOW WARNINGS.

Es una buena práctica incluir siempre IF EXISTS en scripts automatizados. En scripts de migración, el patrón habitual es eliminar el evento si existe y luego recrearlo con la definición actualizada:

DROP EVENT IF EXISTS recalcular_estadisticas;
 
CREATE EVENT recalcular_estadisticas
ON SCHEDULE EVERY 15 MINUTE
DO
    REPLACE INTO estadisticas_productos (producto_id, total_ventas, ultima_actualizacion)
    SELECT producto_id, SUM(cantidad), NOW()
    FROM detalle_pedidos dp
    JOIN pedidos p ON p.id = dp.pedido_id
    WHERE p.estado = 'completado'
    GROUP BY producto_id;

Este patrón garantiza que el evento siempre tenga la definición más reciente, independientemente de si ya existía o no. Sin embargo, ten en cuenta que hay un breve instante entre el DROP y el CREATE en el que el evento no existe. Si la ejecución programada coincide con ese momento, se perderá. Para evitar este riesgo en eventos críticos, considera usar ALTER EVENT en su lugar.

DROP EVENT vs ON COMPLETION NOT PRESERVE

Es importante entender la diferencia entre eliminar un evento explícitamente con DROP EVENT y dejar que MySQL lo elimine automáticamente mediante ON COMPLETION NOT PRESERVE.

Cuando creas un evento con ON COMPLETION NOT PRESERVE (que es el valor por defecto), MySQL elimina la definición del evento automáticamente después de su última ejecución. En eventos puntuales (con AT), esto ocurre inmediatamente después de la ejecución. En eventos recurrentes con cláusula ENDS, ocurre cuando se alcanza la fecha de fin.

La eliminación automática es conveniente para eventos temporales que sabes que no necesitarás una vez completados. Por ejemplo, un evento puntual que migra datos de una tabla temporal a la tabla definitiva:

CREATE EVENT migrar_datos_temporales
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 MINUTE
ON COMPLETION NOT PRESERVE
DO
    INSERT INTO clientes (nombre, email, fecha_registro)
    SELECT nombre, email, NOW()
    FROM clientes_importacion
    WHERE validado = TRUE;

Después de ejecutarse, este evento desaparece automáticamente. No necesitas ejecutar DROP EVENT manualmente.

En cambio, DROP EVENT es una acción deliberada que tú decides cuándo ejecutar. Es necesario para eliminar eventos recurrentes que se ejecutan indefinidamente (sin cláusula ENDS), eventos con ON COMPLETION PRESERVE que ya completaron su ejecución pero cuya definición se conservó, o cualquier evento que ya no sea necesario.

-- Este evento se ejecuta indefinidamente: solo desaparecerá con DROP EVENT
CREATE EVENT limpiar_sesiones
ON SCHEDULE EVERY 1 HOUR
DO
    DELETE FROM sesiones WHERE ultima_actividad < NOW() - INTERVAL 24 HOUR;
 
-- Cuando ya no lo necesites:
DROP EVENT limpiar_sesiones;

Verificar antes de eliminar

Antes de eliminar un evento, es recomendable verificar su definición actual y su estado. Esto te permite confirmar que estás eliminando el evento correcto y tener un respaldo de la definición por si necesitas recrearlo más adelante.

Para ver la definición completa del evento, usa SHOW CREATE EVENT:

SHOW CREATE EVENT purgar_logs_antiguos\G

Esta sentencia muestra la instrucción CREATE EVENT completa que necesitarías para recrear el evento. Es buena práctica copiar esta salida antes de ejecutar el DROP EVENT, especialmente en entornos de producción.

También puedes consultar los metadatos del evento en la tabla information_schema.EVENTS para verificar su estado actual, la última vez que se ejecutó y la próxima ejecución programada. Para más información sobre cómo consultar eventos, revisa el artículo sobre SHOW EVENTS.

SELECT EVENT_NAME, STATUS, LAST_EXECUTED, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = DATABASE()
  AND EVENT_NAME = 'purgar_logs_antiguos';

Si el evento se ejecutó recientemente y la columna LAST_EXECUTED muestra una fecha reciente, puedes tener mayor confianza en que la última ejecución se completó con éxito antes de eliminarlo.

Eliminar múltiples eventos

MySQL no permite eliminar varios eventos en una sola sentencia DROP EVENT. Si necesitas eliminar múltiples eventos, ejecuta una sentencia por cada uno:

DROP EVENT IF EXISTS purgar_logs_antiguos;
DROP EVENT IF EXISTS recalcular_estadisticas;
DROP EVENT IF EXISTS resumen_diario_ventas;
DROP EVENT IF EXISTS limpiar_sesiones_expiradas;

En scripts de limpieza o desinstalación, es habitual agrupar todas las sentencias de eliminación de eventos al principio, antes de eliminar procedimientos, funciones y tablas. Esto evita que un evento intente ejecutarse sobre una tabla que ya no existe durante el proceso de limpieza.

Si necesitas eliminar todos los eventos de una base de datos y no quieres escribir cada nombre manualmente, puedes generar las sentencias dinámicamente consultando information_schema.EVENTS:

SELECT CONCAT('DROP EVENT IF EXISTS ', EVENT_SCHEMA, '.', EVENT_NAME, ';')
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = 'tienda';

Esta consulta genera una sentencia DROP EVENT por cada evento de la base de datos tienda. Puedes copiar la salida y ejecutarla, o redirigirla a un archivo de script.

Privilegios necesarios

Para eliminar un evento necesitas el privilegio EVENT en la base de datos donde reside el evento. No necesitas ser el usuario que lo creó (el DEFINER), solo tener el privilegio adecuado.

GRANT EVENT ON tienda.* TO 'usuario_mantenimiento'@'localhost';

Con este privilegio, usuario_mantenimiento puede eliminar cualquier evento de la base de datos tienda, independientemente de quién lo haya creado.

Ejemplo práctico: ciclo de vida completo

Para ilustrar cuándo entra en juego DROP EVENT, veamos el ciclo de vida completo de un evento programado, desde su creación hasta su eliminación.

Primero, creamos un evento que archiva pedidos antiguos cada noche:

DELIMITER //
 
CREATE EVENT archivar_pedidos_antiguos
ON SCHEDULE EVERY 1 DAY
    STARTS '2026-03-25 02:00:00'
ON COMPLETION PRESERVE
COMMENT 'Mueve pedidos completados con más de 2 años a la tabla de archivo'
DO
BEGIN
    INSERT INTO pedidos_archivo
    SELECT * FROM pedidos
    WHERE estado = 'completado'
      AND fecha_pedido < CURDATE() - INTERVAL 2 YEAR
    LIMIT 5000;
 
    DELETE FROM pedidos
    WHERE estado = 'completado'
      AND fecha_pedido < CURDATE() - INTERVAL 2 YEAR
    LIMIT 5000;
END //
 
DELIMITER ;

Después de unas semanas, decidimos que ya no necesitamos archivar porque hemos implementado particionamiento en la tabla pedidos. Antes de eliminar el evento, verificamos su estado:

SHOW CREATE EVENT archivar_pedidos_antiguos\G

Guardamos la definición por si acaso, y luego lo eliminamos:

DROP EVENT archivar_pedidos_antiguos;

Si hubiéramos creado el evento con ON COMPLETION NOT PRESERVE y una cláusula ENDS, MySQL lo habría eliminado automáticamente al alcanzar la fecha de fin. Pero como lo creamos con PRESERVE y sin ENDS, la única forma de eliminarlo es con DROP EVENT explícito (o deshabilitarlo si solo queremos pausarlo temporalmente).

Errores comunes

El error más evidente es eliminar un evento por equivocación y no tener un respaldo de su definición. En entornos de producción, siempre ejecuta SHOW CREATE EVENT antes del DROP EVENT y guarda la salida. Idealmente, todas las definiciones de eventos deberían estar versionadas en el sistema de control de código fuente junto con el resto de migraciones de base de datos.

Otro error es eliminar un evento mientras una ejecución está en curso y asumir que la ejecución se interrumpirá. Como mencionamos antes, la ejecución activa se completa normalmente; lo que se cancela son las ejecuciones futuras. Si el evento está realizando una operación larga (como eliminar millones de registros), esa operación seguirá hasta completarse.

Un tercer problema frecuente es eliminar un evento en un entorno con replicación y no tener en cuenta que la sentencia DROP EVENT también se replica a los esclavos. Si el evento existía en el maestro pero no en el esclavo (por ejemplo, porque se creó con DISABLE ON SLAVE y luego se eliminó manualmente en el esclavo), la replicación podría generar un error. Usar IF EXISTS evita este problema.

Cuándo usar DROP EVENT

Usa DROP EVENT cuando estés seguro de que un evento ya no es necesario y no lo vas a necesitar en el futuro. Si solo quieres pausar un evento temporalmente, es mucho más seguro deshabilitarlo con ALTER EVENT ... DISABLE. Si el evento ya completó todas sus ejecuciones programadas pero quieres conservar su definición como referencia, usa ON COMPLETION PRESERVE en lugar de eliminarlo.

En resumen, DROP EVENT es la opción definitiva. Recurre a ella cuando la tarea que el evento automatizaba ya no es relevante, cuando vas a reemplazar el evento por un mecanismo diferente (como un job externo o una nueva versión del evento), o cuando estás limpiando una base de datos antes de decomisionarla.

Escrito por Eduardo Lázaro