事件

事件

事件是一类过程式数据库对象。本文重点介绍了创建、修改和删除事件的SQL语法。

事件

事件可以通过MySQL服务器中一个非常有特色的功能模块——事件调度器进行监视,并判断其是否需要被调用。事件调度器可以在指定的时刻执行某些特定的任务,并以此可取代原先只能由操作系统的计划任务来执行的工作。这种需要在指定时刻才被执行的某些特定任务就是事件,这些特定任务通常是一些确定的SQL语句。目前,MySQL可的事件调度器可以精确到每秒钟执行一个任务,这对于一些对于数据实时性要求较高的应用非常适合,例如股票、赔率和比分等。

事件和触发器类似,都是在某些事情发生的时候启动,因此事件也可称为临时触发器。其中,事件是基于特定时间周期触发来执行某些任务,而触发器是基于某个表所产生的事件触发的,它们之间的区别也在于此。

在使用事件调度器这个功能之前,必须确保MySQL中event_scheduler已被开启。这个可以通过如下语句检查:

1
2
3
show variables like 'event_scheduler';
# 或查看系统变量:
select @@event_scheduler;

如果没有开启,可以通过下面的语句开启:

1
2
3
4
# 开启event_scheduler
set global event_scheduler = true;
# 或
set global event_scheduler = 1;

再或者,可以再MySQL的配置文件my.ini中加上:
event_scheduler=1
或者
set global event_scheduler=on

创建事件

语法格式为:

1
2
3
4
create event [if not exists] event_name
on schedule schedule
[enable | disable | disable on slave]
do event_body

其中,schedule的语法格式为:

1
2
3
4
at timestamp [+ interval interval] ...
| every interval
[starts timestamp [+ interval interval] ... ]
[ends timestamp [+ interval] ... ]

interval 的语法格式为:

1
2
3
quantity {year | quarter | month | day | hour | minute |
week | second | year_month | day_hour | day_minute |
day_second | hour_minute | hour_second | minute_second}

主要语法说明如下:

  1. event_name:指定事件名,前面可以添加if not exists来修饰;
  2. schedule:时间调度,用于指定事件何时发生或者每隔多久发生一次,分别对应下面两个子句:
    • at 子句:用于指定事件在某个时刻发生。其中,timestamp表示一个具体的时间点,后面可以加上一个时间间隔,表示在这个时间间隔后事件发生;interval表示这个事件间隔由一个数值和单位构成;quantity是间隔时间的数值。
    • every子句:用于表示事件在指定事件区间内每间隔多长事件发生一次。其中starts子句用于指定开始事件,ends子句用于指定结束事件。
  3. event_body:do子句中的event_body部分用于指定事件启动时所需要执行的代码。如果包含多条语句,可以使用begin…end复合结构。
  4. enable | disable | disable on slave:为可选项,表示事件的一种属性。其中,关键字enable表示该事件是活动的,意味着调度器检查事件动作是否必须调用。关键字disable表示该事件是关闭的,关闭意味着事件的什么存储到目录中,但是调度器不会检查它是否应该调用;关键字disable on slave表示事件在从机中是关闭的。如果不指定三个选项中的任何一个,这则在一个事件创建之后,它立即变为活动的。

例如,在数据库db_school中创建一个事件,用于每个月向表中插入一条数据,该事件开始于下个月并且在2018年12月31日结束:

1
2
3
4
5
6
7
8
9
10
11
12
13
drop event if exists event_insert;
create event if not exists event_insert
on schedule every 1 month
starts curdate() + interval 1 month
ends '2018-12-31'
do
begin
if year(curdate()) < 2019 then
insert into tb_student
values
(null, '张四勇', '男', '1997-12-11', '山西', '汉', 'AC1301');
end if;
end;

修改事件

其语法格式为:

1
2
3
4
5
alter event event_name
[on schedule schedule]
[rename to new_event_name]
[enable | disable | disable on slave]
[do event_body]

alter table 语句与create event语句使用的语法相似,这里不再重复解释。用户可以使用一条alter event语句让一个事件关闭或再次让其活动。需要注意的是,一个事件最后一次被调用后,是无法被修改的,因为此时它已经不再存在了。
例如,临时关闭上面创建的事件:

1
2
3
4
5
6
7
8
9
# 临时关闭上面创建的事件
alter event event_insert disable;

# 再次开启
alter event event_insert enable;

# 改个名字
alter event event_insert
rename to e_insert;

删除事件

1
drop event if exists e_insert;
# MySQL

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×