1、CREATE EVENT创建事件语法
在 MySQL 中,可以通过CREATE EVENT语句来创建事件,其语法格式如下:
CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO event_body;
从上面的语法可以看出,CRATE EVENT 语句由多个子句组成,各子句的详细说明如下表所示。
子句 | 说明 |
---|---|
DEFINER | 可选 用于定义事件执行时检查权限的用户 |
IF NOT EXISTS | 可选 用于判断要创建的事件是否存在 |
EVENT event_name | 必选 用于指定事件名称,event_name 的最大长度为 64 个字符 如果未指定 event_name,则默认为当前的 MySQL 用户名(不区分大小写) |
ON SCHEDULE schedule | 必选 用于定义执行的时间和时间间隔 schedule 表示触发点 |
ON COMPLETION [NOT] PRESERVE | 可选 用于定义事件是否循环执行,即是一次执行还是永久执行,默认为一次执行,即 NOT PRESERVE |
ENABLE | DISABLE | DISABLE ON SLAVE | 可选,用于指定事件的一种属性。 其中,关键字 ENABLE 表示该事件是活动的,即调度器检查事件是否必须调用; 关键字 DISABLE 表示该事件是关闭的,即事件的声明存储到目录中,但是调度器不会检查它是否应该调用; 关键字 DISABLE ON SLAVE 表示事件在从机中是关闭的。 如果不指定以上 3 个选项中的任何一个,默认为 ENABLE |
COMMENT 'comment' | 可选,用于定义事件的注释 |
DO event_body | 必选 用于指定事件启动时所要执行的代码,可以是任何有效的 SQL 语句、存储过程或者一个计划执行的事件。 如果包含多条语句,则可以使用 BEGIN..END 复合结构 |
2、查看事件是否开启
show VARIABLES like 'event%'; -- 若为OFF,则执行下列指令
-- 开启
SET GLOBAL event_scheduler = 1;
SET GLOBAL event_scheduler = ON;
-- 关闭
SET GLOBAL event_scheduler = 0;
SET GLOBAL event_scheduler = OFF;
-- 查看所有事件
SHOW EVENTS;
-- 查看具体的事件执行情况
SELECT * FROM information_schema.events WHERE EVENT_SCHEMA='test' ; -- 查询事件详情
3、创建事件并查看执行数据
3.1 创建一张表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for one_data
-- ----------------------------
DROP TABLE IF EXISTS `one_data`;
CREATE TABLE `one_data` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '名称',
`sort_number` int(11) NULL DEFAULT NULL COMMENT '序号',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '创建事件每秒添加一条数据' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
3.2 创建事件
-- 如果存在存储过程e_test,则删除
DROP PROCEDURE IF EXISTS e_test;
-- 创建事件
CREATE EVENT IF NOT EXISTS e_test
ON SCHEDULE EVERY '1' SECOND STARTS '2022-04-14 10:01:00'
ON COMPLETION PRESERVE COMMENT '每隔1秒钟添加一条数据'
DO INSERT INTO one_data(name, sort_number, create_time) VALUES ('名称', 2, NOW());
-- 创建事件
CREATE EVENT IF NOT EXISTS event_delete_de_records_7days ON SCHEDULE EVERY 1 DAY STARTS '2018-01-01 02:00:00'
ON COMPLETION NOT PRESERVE COMMENT '每天凌晨2点执行一次'
DO INSERT INTO one_data(name, sort_number, create_time) VALUES ('名称', 2, NOW());
3.3 事件参数说明
-- 参数名 说明
-- EVENT_CATALOG 事件存放目录,一般情况下,值为 def,不建议修改
-- EVENT_SCHEMA 事件所在的数据库
-- EVENT_NAME 事件名称
-- DEFINER 事件的定义者
-- TIME_ZONE 事件使用的时区,默认是 SYSTEM,不建议修改
-- EVENT_BODY 一般情况下,值为 SQL,不建议修改
-- EVENT_DEFINITION 该事件的内容,可以是具体的 INSERT 等 SQL,也可以是一个调用的存储过程
-- EVENT_TYPE 事件类型,这个参数比较重要,在定义时指定
-- 有两个值:RECURRING 和 ONE TIME
-- RECURRING 表示只要符合条件就会重复执行,RECURRING 类型的事件一般为 NULL,表示该事件的预计执行时间
-- ONE TIME 只会调用 EXECUTE_AT,针对 one-time 类型的事件有效
-- INTERVAL_VALUE 针对 RECURRING 类型的事件有效,表示执行间隔长度
-- INTERVAL_FIELD 针对 RECURRING 类型的事件有效,表示执行间隔的单位,一般是 SECOND,DAY 等值,可参考创建语法
-- SQL_MODE 当前事件采用的 SQL_MODE
-- STARTS 针对 RECURRING 类型的事件有效,表示一个事件从哪个时间点开始执行,和 one-time 的 EXECUTE_AT 功能类似。
-- 为 NULL 时表示一符合条件就开始执行
-- ENDS 针对 RECURRING 类型的事件有效,表示一个事件到了哪个时间点后不再执行,如果为 NULL 就是永不停止
-- STATUS 一般有三个值,ENABLED、DISABLED 和 SLAVESIDE_DISABLED
-- ON_COMPLETION 只有两个值,PRESERVE 和 NOT PRESERVE
-- CREATED 事件的创建时间
-- LAST_ALTERED 事件最近一次被修改的时间
-- LAST_EXECUTED 事件最近一次执行的时间,如果为 NULL 表示从未执行过
-- EVENT_COMMENT 事件的注释信息
-- ORIGINATOR 当前事件创建时的 server-id,用于主从上的处理,比如 SLAVESIDE_DISABLED
-- CHARACTER_SET_CLIENT 事件创建时的客户端字符集
-- COLLATION_CONNECTION 事件创建时的连接字符校验规则
-- DATABASE_COLLATION 事件创建时的数据库字符集校验规则
3.4 验证查看数据
SELECT * FROM `one_data`;
select lpad((select max(sort_number)+1 from one_data),3,'0')
4、创建第二个事件
4.1 创建表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for interface_call
-- ----------------------------
DROP TABLE IF EXISTS `interface_call`;
CREATE TABLE `interface_call` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接口名称',
`code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '唯一编码',
`all_value` int(10) NULL DEFAULT NULL COMMENT '总调用次数',
`today_value` int(10) NULL DEFAULT NULL COMMENT '今日调用次数',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '健康报告-接口调用数据' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
4.2 每天凌晨执行一次
CREATE DEFINER = `root`@`%` EVENT `interface_call`
ON SCHEDULE
EVERY '1' DAY STARTS '2021-10-12 00:00:00'
COMMENT '每天凌晨执行更新今日调用量为零'
DO UPDATE `interface_call` SET `today_value` = 0, `update_time` = NOW();
4.3 查看事件执行详情
-- 查看具体的事件执行情况
SELECT * FROM information_schema.events WHERE EVENT_SCHEMA='test' and EVENT_NAME='e_test';
-- test:是数据库名称
-- e_test: 具体的事件名称