本文已参与「新人创造礼」活动,一同敞开创造之路

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')

Mysql创建事件执行任务
Mysql创建事件执行任务

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: 详细的事情称号   

Mysql创建事件执行任务
Mysql创建事件执行任务