创建[定义者=用户事件[如果不存在]event_name按计划时间表[on completion [not] preserve] [enable | disable | disable on slave][注释'字符串']做event_body;时间表: {时间戳[+间隔时间间隔)……|每时间间隔(开始时间戳[+间隔时间间隔)……][结束时间戳[+间隔时间间隔)……]}时间间隔:数量{year | quarter | month | day | hour | minute | week | second | year_month | day_hour | day_minute | day_second | hour_minute | hour_second | minute_second}
该语句创建并调度一个新事件。除非启用事件调度器,否则事件不会运行。有关检查事件调度器状态并在必要时启用它的信息,请参见第23.4.2节,“事件调度器配置”.
创建事件
要求事件
要在其中创建事件的模式的权限。如果定义者
子句存在时,所需的特权取决于用户
价值,如在第23.6节,“存储对象访问控制”.
有效的最低要求创建事件
声明如下:
这是一个极小值的例子创建事件
声明:
在当前时间戳+时间间隔1小时内创建事件。SET mycol = mycol + 1;
上面的语句创建了一个名为myevent
.事件创建后每小时执行一次—通过运行一个SQL语句增加myschema.mytable
表的mycol
列1。
的event_name
必须是有效的MySQL标识符,最大长度为64个字符。事件名称不区分大小写,因此不能同时命名两个事件myevent
而且MyEvent
在相同的模式中。通常,管理事件名称的规则与存储例程名称的规则相同。看到第9.2节“模式对象名称”.
事件与模式相关联。的一部分,如果没有指示模式event_name
,假设使用默认(当前)模式。若要在特定模式中创建事件,请使用using限定事件名称
语法。schema_name
.event_name
的定义者
子句指定在事件执行时检查访问权限时要使用的MySQL帐户。如果定义者
从句是存在的用户
值应该是MySQL帐户指定为'
,user_name
“@”host_name
'CURRENT_USER
,或CURRENT_USER ()
.允许用户
值取决于您持有的特权,如中所讨论的第23.6节,“存储对象访问控制”.有关事件安全性的其他信息,请参见该部分。
如果定义者
子句时,默认定义者是执行创建事件
声明。这与指定是一样的定义者= CURRENT_USER
明确。
在事件体中,CURRENT_USER
函数返回在事件执行时用于检查特权的帐户定义者
用户。有关事件中用户审计的信息,请参见第6.2.18节,“基于sql的帐户活动审计”.
如果不存在
有同样的意思吗创建事件
至于创建表
:如果事件命名event_name
已经存在于同一模式中,不采取任何操作,也不会产生错误结果。(但是,在这种情况下会产生警告。)
的按计划
子句决定何时、多长时间、多长时间event_body
为事件重复定义。这个从句有两种形式:
在
用于一次性事件。它指定事件只在给定的日期和时间执行一次时间戳
时间戳
,它必须同时包含日期和时间,或者必须是解析为datetime值的表达式。的值可以使用DATETIME
或时间戳
为此目的键入。如果日期在过去,则会出现警告,如下所示:现在mysql > SELECT ();+---------------------+ | 现在 () | +---------------------+ | 2006-02-10 23:59:01 | +---------------------+ 1行集(0.04秒)mysql >创建事件e_totals - >安排在“2006-02-10 23:59:00”——>做插入测试。现在总数值(());查询好,0行影响,1警告(0.00秒)mysql >显示警告\ G *************************** 1。行***************************级别:备注代码:1588消息:事件执行时间为过去,设置了ON COMPLETION NOT PRESERVE。事件在创建后立即被删除。
创建事件
无论出于何种原因,本身无效的语句都会失败并出现错误。你可以用
CURRENT_TIMESTAMP
指定当前日期和时间。在这种情况下,事件一旦创建就立即起作用。创建一个发生在未来某个时间点的事件,相对于当前的日期和时间,如短语所表达的”三周后”-你可以使用可选从句
+时间间隔
.的时间间隔
时间间隔
部分由两个部分组成,一个数量和一个时间单位,并遵循语法规则描述时间间隔,只是在定义事件时不能使用任何涉及微秒的单位关键字。对于某些间隔类型,可以使用复杂的时间单位。例如,”2分10秒”可以表示为+ interval '2:10' minute_second
.你也可以组合时间间隔。例如,
在当前时间戳+间隔3周+间隔2天
相当于”三周零两天后”.这类条款的每一部分都必须以+时间间隔
.若要定期重复操作,请使用
每一个
条款。的每一个
关键字后面跟一个时间间隔
如前面讨论中所述在
关键字。(+时间间隔
是不使用每一个
)。例如,每6周
意味着”每隔六周”.虽然
+时间间隔
合同中不允许使用从句每一个
子句中允许使用的相同复杂时间单位+时间间隔
.一个
每一个
子句可以包含可选的开始
条款。开始
后面跟着时间戳
值,该值指示操作应在何时开始重复,并可以使用+时间间隔
指定一段时间”从现在开始”.例如,时间间隔
每3个月开始current_timestamp + interval 1周
意味着”从现在开始,每三个月一次”.同样,你可以表达”每两周,从现在开始6小时15分钟”作为每2周开始一次current_timestamp + interval '6:15' hour_minute
.不指定开始
和使用是一样的吗开始CURRENT_TIMESTAMP
也就是说,为事件指定的动作在事件创建后立即开始重复。一个
每一个
子句可以包含可选的结束
条款。的结束
关键字后面跟一个时间戳
值,该值告诉MySQL事件何时应该停止重复。你也可以使用+时间间隔
与时间间隔
结束
;例如,每12小时开始current_timestamp + interval 30分钟结束current_timestamp + interval 4周
相当于”每12小时一次,从现在开始30分钟,到4周后结束”.不使用结束
表示事件无限地继续执行。结束
对复杂时间单位支持相同的语法开始
所做的事。你可以用
开始
,结束
在an中,两者都或都不每一个
条款。如果重复事件没有在其调度间隔内终止,结果可能是该事件的多个实例同时执行。如果这是不希望的,您应该建立一种机制来防止并发实例。例如,你可以使用
GET_LOCK ()
函数、行或表锁定。
的按计划
子句可以使用包含内置MySQL函数和用户变量的表达式来获取任何时间戳
或时间间隔
它所包含的值。在这些表达式中不能使用存储函数或用户定义函数,也不能使用任何表引用;但是,你可以使用选择双
.两者都是如此创建事件
而且改变事件
语句。在这种情况下,对存储函数、用户定义函数和表的引用是特别不允许的,并且会失败并出现错误(参见Bug #22830)。
次按计划
子句使用当前会话进行解释time_zone
价值。这就成为了事件时区;也就是说,用于事件调度的时区,当事件执行时,该时区在事件中生效。这些时间被转换为UTC,并与事件时区一起存储在mysql.event
表格这使事件执行能够按照定义继续进行,而不管对服务器时区或夏令时效果的任何后续更改。有关事件时间表示的其他信息,请参见第23.4.4节,“事件元数据”.另请参阅第13.7.5.18节,“SHOW EVENTS语句”,第24.3.8节“信息模式事件表”.
通常,一旦事件过期,它将立即被删除。您可以通过指定来覆盖此行为完成后保存
.使用完成后不保留
只是显式地显示默认的非持久性行为。
方法可以创建事件,但阻止它处于活动状态禁用
关键字。或者,您也可以使用启用
显式显示默认状态,即活动状态。这是最有用的结合改变事件
(见第13.1.2节,“ALTER EVENT语句”).
的位置也可能出现第三个值启用
或禁用
;禁用在奴隶
为副本上事件的状态设置,以指示该事件在源上创建并复制到副本,但不在副本上执行。看到第16.4.1.16节,“被调用特性的复制”.
方法可以为事件提供注释评论
条款。评论
可以是您希望用于描述事件的最多64个字符的任何字符串。注释文本是字符串文本,必须用引号括起来。
的做
子句指定由事件携带的操作,由一条SQL语句组成。几乎任何可以在存储例程中使用的有效MySQL语句都可以用作计划事件的操作语句。(见第23.8节“存储程序的限制”)。例如,下面的事件e_hourly
对象中删除所有行会话
每小时一次,这张表是site_activity
模式:
注释:每小时清空会话表。删除activity.sessions
MySQL存储sql_mode
系统变量设置在事件创建或更改时生效,并且总是在此设置生效时执行事件,不管事件开始执行时的当前服务器SQL模式是什么.
一个创建事件
语句,其中包含改变事件
声明的做
子句似乎成功;但是,当服务器试图执行结果的计划事件时,执行失败并出现错误。
等语句选择
或显示
当在事件中使用时,仅仅返回结果集没有任何影响;这些输出不会发送到MySQL Monitor,也不会存储在任何地方。但是,您可以使用诸如选择……成
而且插入……选择
存储结果。(有关后者的实例,请参阅本节中的下一个示例。)
类中表引用的默认模式是事件所属的模式做
条款。对其他模式中的表的任何引用都必须使用适当的模式名称进行限定。
类中的复合语句语法与存储例程一样做
子句中使用开始
而且结束
关键词,如下所示:
分隔符| CREATE EVENT e_daily ON SCHEDULE每1天注释“保存会话总数,然后每天清空表”DO BEGIN INSERT INTO site_activity。查询当前时间戳,COUNT(*) FROM site_activity.sessions;从site_activity.sessions删除;结束|分隔符;
此示例使用分隔符
命令来更改语句分隔符。看到第23.1节“定义存储程序”.
更复杂的复合语句,例如在存储例程中使用的语句,可以在事件中使用。这个例子使用了局部变量、一个错误处理程序和一个流控制构造:
分隔符|每5秒创建一个事件。声明sqlexception的continue处理程序;SET v = 0;当v < 5 DO INSERT INTO t1 VALUES (0);SET s1 = s1 + 1;SET v = v + 1;结束时;结束|分隔符;
没有办法直接向事件传递参数或从事件传递参数;然而,可以在事件中调用带有参数的存储例程:
调用myproc(5,27);
如果事件的定义者有足够的权限设置全局系统变量(参见第5.1.8.1节“系统变量特权”),事件可以读写全局变量。由于授予这种特权可能会被滥用,因此在这样做时必须极为小心。
通常,任何在存储例程中有效的语句都可以用于由事件执行的动作语句。有关存储例程中允许的语句的更多信息,请参见第23.2.1节,“存储例程语法”.可以将事件创建为存储例程的一部分,但不能由另一个事件创建事件。