【Mysql】EVENT 使用基础 - Create Event

目录

【Mysql】EVENT 使用基础 - Create Event

【Mysql】EVENT 使用基础 - Alter Event

【Mysql】EVENT 使用基础 - Drop Event

【Mysql】EVENT 使用基础 - 事件调度器配置​​​​​​​


CREATE
    [DEFINER = user]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'string']
    DO event_body;
schedule: {
    AT timestamp [+ INTERVAL interval] ...
  | EVERY interval
    [STARTS timestamp [+ INTERVAL interval] ...]
    [ENDS timestamp [+ INTERVAL interval] ...]
}

interval:
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

此语句创建并安排一个新事件,除非启用事件调度程序,否则事件不会运行。

有效声明的最低要求如下:

  • 关键字Create Event加上事件名称,它在数据库模式中唯一标识事件。

  • 一个On Schedule子句,它确定事件执行的时间和频率。

  • 子句,其中Do包含要由事件执行的 SQL 语句。

最小语句示例如下:

CREATE EVENT myevent
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
    DO
      UPDATE myschema.mytable SET mycol = mycol + 1;

上面的语句创建了一个名为myevent的事件,创建后一小时执行一次,方法是运行一条 SQL语句,

将表myschema.mytable列的值增加1。

Event事件名称必须是最大长度为64个字符的有效Mysql标识符,不区分大小写。

On Schedule该子句采用两种形式:

  • At timestamp 用于一次性事件,指定事件仅在给定的日期或事件执行一次

它必须包括日期和时间,或者必须是解析为日期时间的表达式,因此我们可以使用 DATETIME类型的值(注:如果日期是过去的日期,则会出现警告),如下所示:

mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2006-02-10 23:59:01 |
+---------------------+
1 row in set (0.04 sec)

mysql> CREATE EVENT e_totals
    ->     ON SCHEDULE AT '2006-02-10 23:59:00'
    ->     DO INSERT INTO test.totals VALUES (NOW());
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Note
   Code: 1588
Message: Event execution time is in the past and ON COMPLETION NOT
         PRESERVE is set. The event was dropped immediately after
         creation.

对于某些间隔类型,可以使用复杂的时间单位,例如,两分十秒,则可表示为:

interval interval+ INTERVAL '2:10' MINUTE_SECOND
  • Every子句用于定期重复操作,例如,Every 6 Week 表示每周六

一个Every子句可以包含一个可选Starts子句,后跟一个timestamp值,该值指示动作应何时开始重复,也可用于指定从现在开始的时间量。例如,每三个月一次,从现在开始一周,以及每两周一次,从现在开始六小时十五分钟。

EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + INTERVAL 1 WEEK
EVERY 2 WEEK STARTS CURRENT_TIMESTAMP + INTERVAL '6:15' HOUR_MINUTE

一个Every子句可以包含一个可选Ends子句,后跟一个timestamp值,该值指示动作何时结束。例如,每十二小时一次,从现在开始三十分钟,四个星期结束。

EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK

On Completion Preserve,当Event到期或Ends结束时,Event会被Disable,但不会被Drop。

On Completion Not Preserve,当Event到期或Ends结束时,Event会被自动Drop删除。

Enable表示创建Event时处于活动状态,Disable表示创建Event时处于非活动状态。

子句指定携带Do,后接一条SQL语句组成,任何可以在存储过程中使用的有效Mysql语句可以用作事件的操作语句。

CREATE EVENT e_hourly
    ON SCHEDULE
      EVERY 1 HOUR
    COMMENT 'Clears out sessions table each hour.'
    DO
      DELETE FROM site_activity.sessions;

诸如SELECT或SHOW仅返回结果集的语句在事件中使用时无效,这些输出不会发送到 MySQL Monitor,也不会存储在任何地方。但是,您可以使用诸如 SELECT ... INTO和 INSERT INTO ... SELECT存储结果的语句。

与存储过程一样,您也可以在Do子句中使用复合语句语法,如下:

delimiter |

CREATE EVENT e_daily
    ON SCHEDULE
      EVERY 1 DAY
    COMMENT 'Saves total number of sessions then clears the table each day'
    DO
      BEGIN
        INSERT INTO site_activity.totals (time, total)
          SELECT CURRENT_TIMESTAMP, COUNT(*)
            FROM site_activity.sessions;
        DELETE FROM site_activity.sessions;
      END |

delimiter ;

当然,可以在事件中调用带有参数的存储过程,例如:

CREATE EVENT e_call_myproc
    ON SCHEDULE
      AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
    DO CALL myproc(5, 27);

通常,任何在存储过程中有效的语句都可以用于事件执行的动作语句,您可以创建一个事件作储过程的一部分,但一个事件不能由另一个事件创建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值