10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

13.1.12 CREATE EVENT语句

创建[定义者=用户事件[如果不存在]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节,“存储对象访问控制”

有效的最低要求创建事件声明如下:

  • 关键字创建事件加上一个事件名,它在数据库模式中唯一标识事件。

  • 一个按计划子句,该子句确定事件执行的时间和频率。

  • 一个子句,其中包含要由事件执行的SQL语句。

这是一个极小值的例子创建事件声明:

在当前时间戳+时间间隔1小时内创建事件。SET mycol = mycol + 1;

上面的语句创建了一个名为myevent.事件创建后每小时执行一次—通过运行一个SQL语句增加myschema.mytable表的mycol列1。

event_name必须是有效的MySQL标识符,最大长度为64个字符。事件名称不区分大小写,因此不能同时命名两个事件myevent而且MyEvent在相同的模式中。通常,管理事件名称的规则与存储例程名称的规则相同。看到第9.2节“模式对象名称”

事件与模式相关联。的一部分,如果没有指示模式event_name,假设使用默认(当前)模式。若要在特定模式中创建事件,请使用using限定事件名称schema_nameevent_name语法。

定义者子句指定在事件执行时检查访问权限时要使用的MySQL帐户。如果定义者从句是存在的用户值应该是MySQL帐户指定为user_name“@”host_nameCURRENT_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节,“存储例程语法”.可以将事件创建为存储例程的一部分,但不能由另一个事件创建事件。