MySQL中的CREATE EVENT 语句详解

CREATE EVENT 语句在 MySQL 中用于创建一个事件调度器(Event Scheduler)的事件。事件调度器允许你安排数据库任务(如查询、数据更新等)在将来的某个时间点自动执行,或者根据特定的时间间隔重复执行。这对于需要定期执行的任务特别有用,比如数据清理、报表生成等。

CREATE[DEFINER = user]EVENT[IF NOT EXISTS]event_nameON 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需要创建事件的模式的EVENT权限。如果存在DEFINER子句,则所需的权限取决于用户值。

有效CREATE EVENT语句的最低要求如下:

  1. 关键字CREATE EVENT加上事件名称,该名称在数据库模式中唯一标识事件。
  2. 按计划条款,决定事件执行的时间和频率。
  3. DO子句,其中包含要由事件执行的SQL语句。

这是一个最小CREATE EVENT语句的示例:

CREATE EVENT myeventON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOURDOUPDATE myschema.mytable SET mycol = mycol + 1;

前面的语句创建了一个名为myevent的事件。此事件在创建后一小时执行一次,通过运行一条SQL语句,将myschema.mytable表的mycol列的值递增1。

event_name必须是有效的MySQL标识符,最大长度为64个字符。事件名称不区分大小写,因此不能在同一架构中有两个名为myevent和myevent的事件。一般来说,管理事件名称的规则与存储例程名称的规则相同。

事件与架构相关联。如果event_name中没有指定任何模式,则假定为默认(当前)模式。要在特定架构中创建事件,请使用schema_name.event_name语法用架构限定事件名称。

DEFINER子句指定在事件执行时检查访问权限时使用的MySQL帐户。如果存在DEFINER子句,则用户值应该是指定为“user_name”@“host_name”、CURRENT_user或CURRENT_user()的MySQL帐户。

如果省略DEFINER子句,则默认定义者是执行CREATE EVENT语句的用户。这与显式指定DEFINER=CURRENT_USER相同。

在事件体中,CURRENT_USER函数返回用于在事件执行时检查权限的帐户,即DEFINER用户。有关事件中用户审核的信息。

IF NOT EXISTS对CREATE EVENT和CREATE TABLE的含义相同:如果名为EVENT_name的事件已存在于同一架构中,则不会采取任何行动,也不会产生错误结果。(但是,在这种情况下会生成警告。)

ON SCHEDULE子句决定了为事件定义的event_body何时、多久重复一次以及重复多长时间。本条款采用以下两种形式之一:

  • AT时间戳用于一次性事件。它指定事件仅在时间戳给出的日期和时间执行一次,时间戳必须包括日期和时间,或者必须是解析为日期时间值的表达式。为此,您可以使用DATETIME或TIMESTAMP类型的值。如果日期是过去的,则会出现警告,如下所示:
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: NoteCode: 1588
Message: Event execution time is in the past and ON COMPLETION NOTPRESERVE is set. The event was dropped immediately aftercreation.

CREATE EVENT语句本身无效,无论出于什么原因,都会失败并出现错误。

您可以使用CURRENT_TIMESTAMP指定当前日期和时间。在这种情况下,事件一旦创建就会立即生效。

要创建相对于当前日期和时间在未来某个时间点发生的事件,例如“三周后”所表示的事件,可以使用可选子句+INTERVAL间隔。间隔部分由两部分组成,即数量和时间单位,并遵循时间间隔中描述的语法规则,但在定义事件时不能使用任何涉及微秒的单位关键字。对于某些区间类型,可以使用复杂的时间单位。例如,“2分10秒”可以表示为+INTERVAL'2:10'MINUTE_SECOND。

您还可以组合间隔。例如,在当前时间戳+间隔3周+间隔2天相当于“从现在起三周零两天”。此类条款的每一部分都必须以+INTERVAL开头。

  • 要定期重复操作,请使用EVERY子句。如前面对AT关键字的讨论所述,每个关键字后面都有一个间隔。(+INTERVAL不与EVERY一起使用。)例如,EVERY 6 WEEK表示“每六周”。

虽然EVERY子句中不允许使用+INTERVAL子句,但您可以使用+INTERVAL中允许的相同复杂时间单位。

EVERY子句可以包含可选的STARTS子句。STARTS后面是一个时间戳值,指示何时应该开始重复操作,也可以使用+INTERVAL间隔来指定“从现在开始”的时间量。例如,每3个月开始当前时间戳+间隔1周意味着“从现在开始每三个月”。同样,您可以表示“从现在起每两周,从六小时十五分钟开始”,因为每两周从当前时间戳+间隔'6:15'小时分开始。不指定STARTS与使用STARTS CURRENT_TIMESTAMP相同——也就是说,为事件指定的操作在事件创建后立即开始重复。

EVERY子句可以包含可选的ENDS子句。ENDS关键字后面跟一个时间戳值,该值告诉MySQL事件何时应该停止重复。您也可以在ENDS中使用+INTERVAL间隔;例如,每12小时开始电流_时间戳+间隔30分钟结束电流_时间戳记+间隔4周相当于“每12小时,从现在开始30分钟,到现在结束四周”。不使用ENDS意味着事件会无限期地继续执行。

ENDS支持与STARTS相同的复杂时间单位语法。

您可以在EVERY子句中使用开始、结束或两者都不使用。

如果重复事件未在其调度间隔内终止,则结果可能是该事件的多个实例同时执行。如果这是不可取的,您应该建立一种机制来防止同时发生实例。例如,您可以使用GET_LOCK()函数,或行或表锁定。

ON SCHEDULE子句可以使用涉及内置MySQL函数和用户变量的表达式来获取它包含的任何时间戳或间隔值。您不得在此类表达式中使用存储函数或可加载函数,也不得使用任何表引用;但是,您可以使用SELECT FROM DUAL。CREATE EVENT和ALTER EVENT语句都是如此。在这种情况下,特别不允许引用存储函数、可加载函数和表,并且会因错误而失败(参见Bug#22830)。

ON SCHEDULE子句中的时间使用当前会话时区值进行解释。这将成为事件时区;即用于事件调度并且在事件执行时在事件内有效的时区。这些时间转换为UTC,并与事件时区一起存储在内部。这使得事件执行能够按照定义进行,而不管服务器时区或夏令时的任何后续更改。

通常,一旦事件过期,它就会立即被删除。您可以通过指定ON COMPLETION PRESERVE来覆盖此行为。使用ON COMPLETION NOT PRESERVE只会使默认的非持久性行为显式化。

您可以创建事件,但可以使用DISABLE关键字阻止其处于活动状态。或者,您可以使用ENABLE来明确默认状态,即活动状态。这与ALTER EVENT结合使用最为有用。

第三个值也可能出现在“启用”或“禁用”的位置;DISABLE ON SLAVE是为副本上的事件状态设置的,表示该事件是在复制源服务器上创建并复制到副本上的,但不会在副本上执行。

您可以使用comment子句为事件提供注释。注释可以是您希望用于描述事件的最多64个字符的任何字符串。注释文本是字符串文字,必须用引号括起来。

DO子句指定事件执行的操作,由SQL语句组成。几乎任何可以在存储例程中使用的有效MySQL语句都可以用作计划事件的操作语句。例如,以下事件e_hourly每小时从会话表中删除一次所有行,其中该表是site_activity模式的一部分:

CREATE EVENT e_hourlyON SCHEDULEEVERY 1 HOURCOMMENT 'Clears out sessions table each hour.'DODELETE FROM site_activity.sessions;

MySQL存储创建或更改事件时生效的sql_mode系统变量设置,并且始终使用此设置执行事件,而不管事件开始执行时的当前服务器sql模式如何。

在DO子句中包含ALTER EVENT语句的CREATE EVENT语句似乎成功;然而,当服务器尝试执行由此产生的计划事件时,执行失败并出现错误。

注:
SELECT或SHOW等仅返回结果集的语句在事件中使用时无效;这些输出不会发送到MySQL监视器,也不会存储在任何地方。但是,您可以使用SELECT等语句。。。INTO和INSERT INTO。。。选择存储结果的选项。

事件所属的模式是DO子句中表引用的默认模式。对其他模式中表的任何引用都必须使用正确的模式名称进行限定。

与存储例程一样,您可以通过使用BEGIN和END关键字在DO子句中使用复合语句语法,如下所示:

delimiter |CREATE EVENT e_dailyON SCHEDULEEVERY 1 DAYCOMMENT 'Saves total number of sessions then clears the table each day'DOBEGININSERT INTO site_activity.totals (time, total)SELECT CURRENT_TIMESTAMP, COUNT(*)FROM site_activity.sessions;DELETE FROM site_activity.sessions;END |delimiter ;

此示例使用delimiter命令更改语句分隔符。

事件中可能存在更复杂的复合语句,例如存储例程中使用的复合语句。此示例使用局部变量、错误处理程序和流控制构造:

delimiter |CREATE EVENT eON SCHEDULEEVERY 5 SECONDDOBEGINDECLARE v INTEGER;DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;SET v = 0;WHILE v < 5 DOINSERT INTO t1 VALUES (0);UPDATE t2 SET s1 = s1 + 1;SET v = v + 1;END WHILE;END |delimiter ;

无法直接向事件传递参数或从事件传递参数;然而,可以在事件中调用带有参数的存储例程:

CREATE EVENT e_call_myprocON SCHEDULEAT CURRENT_TIMESTAMP + INTERVAL 1 DAYDO CALL myproc(5, 27);

如果事件的定义者具有足够的权限来设置全局系统变量,则该事件可以读取和写入全局变量。由于授予此类特权可能会被滥用,因此必须格外小心。

通常,在存储例程中有效的任何语句都可以用于由事件执行的动作语句。无法将事件创建为存储例程的一部分,也无法通过另一个事件创建事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/49543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS】关于鸿蒙消息推送的心得体会(二)

【HarmonyOS】关于鸿蒙消息推送的心得体会&#xff08;二&#xff09; 前言 推送功能的开发与传统功能开发还是有很大区别。首先最大的区别点就在于需要多部门之间的协同&#xff0c;作为鸿蒙客户端开发&#xff0c;你需要和产品&#xff0c;运营&#xff0c;以及后台开发一起…

泛型、Trait和生命周期(10)

泛型、Trait和生命周期 1.泛型数据类型1.1在函数定义中使用泛型1.2结构体定义中的泛型1.3枚举定义中的泛型1.4方法定义中的泛型1.5泛型代码的性能 2.Trait: 定义共同行为2.1定义trait2.2为类型实现trait2.3默认实现2.4trait作为参数2.5Trait Bound语法2.6通过 指定多个trait b…

golang语言 .go文件版本条件编译,xxx.go文件指定go的编译版本必须大于等于xxx才生效的方法, 同一个项目多个go版本文件共存方法

在go语言中&#xff0c;我们不关是可以在编译时指定版本&#xff0c; 在我们的xxx.go文件中也可以指定go的运行版本&#xff0c;即 忽略go.mod中的版本&#xff0c;而是当当前的go运行版本达到指定条件后才生效的xxx.go文件。 方法如下&#xff1a; 我们通过在xxx.go文件的头部…

vue3访问URL添加session变量

本文主要讲了我们在访问网址时候&#xff0c;为了实现一些免登录等效果&#xff0c;需要在会话Session中添加一些变量&#xff0c;已实现特定效果。 关键代码在于蓝色这部分&#xff1a; <script setup> import { ref } from vue import axios from axios const loginUrl…

java小白针对大数据多表联查的一些小思路,帮助新手学习

假设我的member_user里面有352599条数据&#xff0c;gp_project里面有1211974条数据 SELECT gp.*, mu.linkmanName , mu.linkmanPhone, mu.legalPersonName, mu.legalPersonPhone, mu.address, mu.registerArea FROM gp_project gp LEFT JOIN member_user mu ON mu.supplierId…

通过“微软蓝屏”事件对网络安全的思考

近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件&#xff0c;源于美国电脑安全技术公司“众击”提供的一个带有“缺陷”的软件更新&…

C++在高性能计算与游戏开发中的应用

在追求极致性能和用户体验的今天&#xff0c;C凭借其高效的执行效率和强大的控制能力&#xff0c;在高性能计算&#xff08;HPC&#xff09;和游戏开发领域大放异彩。无论是处理大规模数据集的并行计算&#xff0c;还是构建复杂、逼真的游戏世界&#xff0c;C都展现出了无可比拟…

04 HTML CSS JavaScript

文章目录 HTML1、HTML介绍2、快速入门3、基础标签4、图片、音频、视频标签5、超链接标签6、列表标签7、表格标签8、布局标签9、 表单标签 CSS1、 概述2、 css 导入方式3、 css 选择器4、 css 属性 JavaScript1、JavaScript简介2、JavaScript引入方式3、JavaScript基础语法4、Ja…

【C++刷题】优选算法——分治

颜色分类 void sortColors(vector<int>& nums) {int left -1, right nums.size();for (int i 0; i < right;) {if (nums[i] 0) {swap(nums[left], nums[i]);} else if (nums[i] 2) {swap(nums[--right], nums[i]);} else {i;}} }排序数组 // 快速排序 void…

Potree在web端显示大型点云模型文件

一、克隆项目代码&#xff08;准备好上网工具&#xff0c;得先有node.js npm 环境&#xff09; git clone https://github.com/potree/potree.git二、依赖安装&#xff08;换淘宝镜像能快一些&#xff09; cd potree npm install三、运行 npm start四、使用样例 打开浏览器…

44、PHP 实现数据流中的中位数(含源码)

题目&#xff1a; PHP 实现数据流中的中位数 描述&#xff1a; 如何得到一个数据流中的中位数&#xff1f; 如果从数据流中读出奇数个数值&#xff0c;那么中位数就是所有数值排序之后位于中间的数值。 如果从数据流中读出偶数个数值&#xff0c;那么中位数就是所有数值排序之…

【Spring】SpringRetry重试机制和Spring异步任务发送操作结合应用场景实操,通俗易懂

平时调用一些第三方接口或者内部接口&#xff0c;可能出现处理异常或者超时或者意外因素&#xff0c;我们可以使用重试机制来为用户提高体验。 1.引用依赖 <dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</a…

【Qt】文字换行

目录 Qt换行方式一方法二 参考文章 在Qt控件中经常遇到文字超出文本框&#xff0c;因此介绍几种换行方式 Qt换行 方式一 QLabel 设置setWordWrap(true);实现换行。但此方法对于多语言文本不太友好&#xff0c;可以在超出文本框时添加省略符&#xff0c;方法如下 //要显示的超…

单片机学习(18)--红外遥控器

红外遥控器 17.1红外遥控的基础知识1.红外遥控简介2.硬件电路3.基本发送和接收4.NEC编码5.遥控器键码6.51单片机的外部中断7.外部中断寄存器 17.2红外遥控的程序代码1.红外遥控&#xff08;1&#xff09;工程目录&#xff08;2&#xff09;main.c函数&#xff08;3&#xff09;…

vue 实战 tab标签页+el-card+流式布局+异步接口调用

<template><div><!-- 布局按钮 --><el-button click"dialogVisible true">布局配置查看</el-button><!-- 布局配置对话框 --><el-dialog :visible.sync"dialogVisible" title"布局配置查看" width"…

Invalid bound statement (not found)

Invalid bound statement (not found) 首先申明的是这个错误一般是使用mybatis方法没有找到或者参数不匹配等原因造成的&#xff01; 原本项目是使用eclipse运行&#xff0c;导入到idea之后&#xff0c;项目启动就报错 …Invalid bound statement (not found)… 解决办法&#…

Python 爬虫(爬取百度翻译的数据)

前言 要保证爬虫的合法性&#xff0c;可以从以下几个方面着手&#xff1a; 遵守网站的使用条款和服务协议&#xff1a;在爬取数据之前&#xff0c;仔细阅读目标网站的相关规定。许多网站会在其 robots.txt 文件中明确说明哪些部分可以爬取&#xff0c;哪些不可以。 例如&…

中电金信:AI数据服务

01 方案简介 AI数据服务解决方案为泛娱乐、电子商务、交通出行等行业提供数据处理、数据分析、AI模型训练等服务&#xff0c;通过自主研发的IDSC自动化数据服务平台与客户业务流程无缝衔接&#xff0c;实现超低延时的实时数据处理支持。 02 应用场景 智能医疗&#xff1a; 通…

深入浅出mediasoup—通信框架

libuv 是一个跨平台的异步事件驱动库&#xff0c;用于构建高性能和可扩展的网络应用程序。mediasoup 基于 libuv 构建了包括管道、信号和 socket 在内的一整套通信框架&#xff0c;具有单线程、事件驱动和异步的典型特征&#xff0c;是构建高性能 WebRTC 流媒体服务器的重要基础…

《javaEE篇》--单例模式详解

目录 单例模式 饿汉模式 懒汉模式 懒汉模式(优化) 指令重排序 总结 单例模式 单例模式属于一种设计模式&#xff0c;设计模式就好比是一种固定代码套路类似于棋谱&#xff0c;是由前人总结并且记录下来我们可以直接使用的代码设计思路。 单例模式就是&#xff0c;在有…