ALTER
[DEFINER = user]
EVENT event_name
[ON SCHEDULE schedule]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO new_event_name]
[ENABLE | DISABLE | DISABLE ON {REPLICA | SLAVE}]
[COMMENT 'string']
[DO event_body]
修改事件 语句用于修改现有事件的一个或多个特征,而无需删除并重新创建它。每个 DEFINER、ON SCHEDULE、ON COMPLETION、COMMENT、ENABLE / DISABLE 和 DO 子句的语法与 创建事件 中使用的语法完全相同。(参见 第 15.1.13 节,“创建事件语句”。)
任何用户都可以修改在该用户具有 EVENT 权限的数据库上定义的事件。当用户执行成功的 修改事件 语句时,该用户将成为受影响事件的定义者。
修改事件 仅适用于现有事件:
mysql> ALTER EVENT no_such_event
> ON SCHEDULE
> EVERY '2:3' DAY_HOUR;
ERROR 1517 (HY000): Unknown event 'no_such_event'
在以下每个示例中,假设名为 myevent 的事件定义如下所示:
CREATE EVENT myevent
ON SCHEDULE
EVERY 6 HOUR
COMMENT 'A sample comment.'
DO
UPDATE myschema.mytable SET mycol = mycol + 1;
以下语句将 myevent 的计划从每六小时执行一次(立即开始)更改为每十二小时执行一次,从语句运行后的四小时开始:
ALTER EVENT myevent
ON SCHEDULE
EVERY 12 HOUR
STARTS CURRENT_TIMESTAMP + INTERVAL 4 HOUR;
可以在单个语句中更改事件的多个特征。此示例将 myevent 执行的 SQL 语句更改为从 mytable 中删除所有记录的语句;它还更改了事件的计划,使其在运行此 修改事件 语句后的一天执行一次。
ALTER EVENT myevent
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
DO
TRUNCATE TABLE myschema.mytable;
在 修改事件 语句中,仅为要更改的特征指定选项;省略的选项将保留其现有值。这包括 创建事件 的任何默认值,例如 ENABLE。
要禁用 myevent,请使用以下 修改事件 语句:
ALTER EVENT myevent
DISABLE;
ON SCHEDULE 子句可以使用包含内置 MySQL 函数和用户变量的表达式来获取其中包含的任何 timestamp 或 interval 值。你不能在这样的表达式中使用存储过程或可加载函数,也不能使用任何表引用;但是,你可以使用 SELECT FROM DUAL。这对于 ALTER EVENT 和 CREATE EVENT 语句都是如此。在这种情况下,引用存储过程、可加载函数和表是明确不允许的,并且会失败并出现错误(参见 Bug #22830)。
尽管在其 DO 子句中包含另一个 ALTER EVENT 语句的 ALTER EVENT 语句似乎成功了,但当服务器尝试执行生成的计划事件时,执行会失败并出现错误。
要重命名事件,请使用 ALTER EVENT 语句的 RENAME TO 子句。此语句将事件 myevent 重命名为 yourevent:
ALTER EVENT myevent
RENAME TO yourevent;
你还可以使用 ALTER EVENT ... RENAME TO ... 和 符号将事件移动到不同的数据库,如下所示:db_name.event_name
ALTER EVENT olddb.myevent
RENAME TO newdb.myevent;
要执行前一条语句,执行它的用户必须对 olddb 和 newdb 数据库都具有 EVENT 权限。
没有 RENAME EVENT 语句。
值 DISABLE ON REPLICA 在副本上使用,而不是 ENABLE 或 DISABLE,以指示在复制源服务器上创建并复制到副本但不在副本上执行的事件。通常,DISABLE ON REPLICA 会根据需要自动设置;但是,在某些情况下,你可能希望或需要手动更改它。有关更多信息,请参阅第 19.5.1.16 节“调用功能的复制”。
DISABLE ON REPLICA 替代了 DISABLE ON SLAVE,后者从 MySQL 8.2.0 开始弃用。