Mysql数据库事件使用与示例

时间:2023-03-10 05:55:20
Mysql数据库事件使用与示例

1 事件简介

事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”。

事件和触发器类似,都是在某些事情发生的时候启动。当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的。由于他们彼此相似,所以事件也称为临时性触发器。

事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。

2 事件的优缺点
    2.1 优点

一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。

可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下就非常实用了。

   2.2 缺点
    定时触发,不可以调用。

3件创建

  一条create event语句创建一个事件。每个事件由两个主要部分组成,第一部分是事件调度(event schedule),表示事件何时启动以及按什么频率启动,第二部分是事件动作(event action ),这是事件启动时执行的代码,事件的动作包含一条SQL语句,它可能是一个简单地insert或者update语句,也可以使一个存储过程或者benin...end语句块,这两种情况允许我们执行多条SQL。

一个事件可以是活动(打开)的或停止(关闭)的,活动意味着事件调度器检查事件动作是否必须调用,停止意味着事件的声明存储在目录中,但调度器不会检查它是否应该调用。在一个事件创建之后,它立即变为活动的,一个活动的事件可以执行一次或者多次。

  一、   如果开启事件

    在使用事件这个功能,首先要保证你的mysql的版本是5.1以上,然后还要查看你的mysql服务器上的事件是否开启。

    查看事件是否开启,使用如下命令查看:

    SHOW VARIABLES LIKE 'event_scheduler';

Mysql数据库事件使用与示例

    通过动态参数修改 SET GLOBAL event_scheduler = ON;

    更改完这个参数就立刻生效了  注意:还是要在my.ini 中添加event_scheduler=ON。因为如果没有添加的话,mysql重启事件又会回到原来的状态了。

 创建语句方式:

create event [ if not exists  ] EVENT_NAME

on schedule SCHEDULE

[ on completion [ not ] preserve ]  //not即计划任务执行完毕后自动删除该事件,默认操作。

[ enable | disable ]

[ comment COMMENT ]

do SQL;

  注释:所有中括号([])中的内容为可写选项(下同)

       EVENT_NAME:你自己想要设置的事件名称

       SCHEDULE :    方式一: at TIMESTAMP(必须是'2017-09-11 17 :00:00' 这种格式)

            方式二: every INTERVAL(整数值)  UNIT(时间单位,可以是:YEAR | QUARTER | MONTH | DAY | HOUR| MINUTE |WEEK | SECOND | YEAR_MONTH |DAY_HOUR                  |DAY_MINUTE|DAY_SECOND| HOUR_MINUTE |HOUR_SECOND| MINUTE_SECOND)

                    [  starts  TIMESTAMP(同上)  [ + interval(必须写) INTERVAL(整数值) UNIT(同上) ]  ]

                 [  ends TIMESTAMP(同上)   [ + interval(必须写) INTERVAL(整数值) UNIT(同上) ] ]

        COMMENT:填写的注释,utf8字符集时不能是中文。长度也不能超过64个字节。

        SQL:需要执行的sql语句。(可以是存储过程)

  

注意:

    通过show events只能查看当前库中创建的事件

  事件执行完即释放,如立即执行事件,执行完后,事件便自动删除,多次调用事件或等待执行事件可以查看到。

    如果两个事件需要在同一时刻调用,mysql会确定调用他们的顺序,如果要指定顺序,需要确保一个事件至少在另一个事件1秒后执行

   对于递归调度的事件,结束日期不能在开始日期之前。

   select可以包含在一个事件中,然而他的结果消失了,就好像没执行过。

件修改

更改事件的语法

ALTER

EVENT event_name

[ON SCHEDULE schedule]

[ON COMPLETION [NOT] PRESERVE]

[RENAME TO new_event_name]

[ENABLE | DISABLE | DISABLE ON SLAVE]

[COMMENT 'comment']

[DO event_body]

注意:这里的大写是必须这么写的,小写同创建的代名词一样。

件删除

DROP EVENT [IF EXISTS]  event_name(代名词)