`

【转】mysql event----语法之CREATE EVENT

阅读更多
mysql event----语法之CREATE EVENT
(2007-04-08 16:35:47)
转载
分类: mysql


一、EVENT相关变量与参数设置
    1、 默认 EVENT 支持是没有启动的,可以通过下面的命令来查看状态:

       Select @@event_scheduler;

       如果返回 OFF ,则需要执行下面的命令启动:

       SET GLOBAL event_scheduler = ON;

       上面虽然启动了 EVENT ,但是每次重启 mysql 之后 EVENT 并没有自动启动,那么如何让它自动启动呢?

       方法一:找到当前使用的 .cnf 文件,在 [mysqld] 的下面加入如下行

              event_scheduler=1

       方法二:启动 mysql 的时候增加 --event_scheduler=1

              mysql start --event_scheduler=1


       2> 修改事件 (ALTER EVENT)

              ALTER EVENT event_name

                  [ON SCHEDULE schedule]

                  [RENAME TO new_event_name]

                  [ON COMPLETION [NOT] PRESERVE]

                  [COMMENT ''comment'']

                  [ENABLE | DISABLE]

                  [DO sql_statement]

                  1) 临时关闭事件

                      ALTER EVENT e_test DISABLE;

                  2) 开启事件

                      ALTER EVENT e_test ENABLE;

                  3) 将每天清空 test 表改为 5 天清空一次:

                      ALTER EVENT e_test
                      ON SCHEDULE EVERY 5 DAY;



       3> 删除事件 (DROP EVENT)

                  语法很简单,如下所示:

                  DROP EVENT [IF EXISTS] event_name

                  例如删除前面创建的 e_test 事件

                  DROP EVENT e_test;

                  当然前提是这个事件存在,否则会产生 ERROR 1513 (HY000): Unknown event 错误,因此最好加上 IF EXISTS

                  DROP EVENT IF EXISTS e_test;


二、具体创建语法如下:

CREATE EVENT
[/size][size=medium]
CREATE EVENT [IF NOT EXISTS] event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE]
    [COMMENT 'comment']
    DO sql_statement;

schedule:
    AT timestamp [+ INTERVAL interval]
  | EVERY interval [STARTS timestamp] [ENDS timestamp]

interval:
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

关键字evnet name一旦创建,它在当前的计划中唯一的标识一个事件调度
ON SCHEDULE: 决定事件什么时候,如何的调度
DO:包含时间要执行的sql语句。
如 :
CREATE EVENT myevent
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
    DO
      UPDATE myschema.mytable SET mycol = mycol + 1;
表示:

event name:myevent
一个小时后被执行一次-----myschema.mytable表的mycol 列的值增长1
event name 最大长度64个字符,如果没有指定,那就是当前的mysql用户名,他不区分大小写
比如在同一个数据库的计划中你不能有myevent and MyEvent这样来那2个event name

IF NOT EXISTS : 如果已经存在相同的event name,则不进行任何操作,也不产生任何错误结果,只是产生一

个警告
ON SCHEDULE :确定何时、多久、多长时间一次重复执行sql_statement定义的语句
     AT timestamp :用于一次性事件。他指定在一个具体的时间执行一次,包括日期和时间(DATETIME or

TIMESTAMP 类型的),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());
ERROR 1522 (HY000): Activation (AT) time is in the past

如果用CURRENT_TIMESTAMP,则一创建就执行
创造一个事件,发生在将来的某个时间日期和时间,如“从现在开始3个星期后”

你可以使用选项“+ INTERVAL interval”,interval 由数量和时间的单位2部分组成,间隔的距离用“

DATE_ADD() ”函数来支配,单位的关键字也是相同,除了您不能使用微秒的任何单位。

你也可以结合时间间隔。比如:“AT CURRENT_TIMESTAMP + INTERVAL 3 WEEK + INTERVAL 2 DAY ”,表示

从现在起3个星期零2天,这选项的的每个部分必须以“+ INTERVAL”开始。

在一段时间间隔内将常性的重复的起作用。你可以使用一个“EVERY ”选项,“EVERY ”关键字,“+

INTERVAL 关键字时不用every”, 比如“EVERY 6 WEEK”表示每6周,“every”关键字后+interval。
在一个简单的every字句中不能用every关键字和+ INTERVAL 关键字联合起来,比如你可以用EVERY '2:10'

MINUTE_SECOND.表示“every two minutes and ten seconds”

EVERY 选项也可以包含STARTS选项,当一个动作开始重复时用STARTS timestamp ,也可以用"+ INTERVAL "关

键字,interval 表示一个从现在开始的时间,比如: EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + 1 WEEK 表

示从现在开始一个星期后,每3个月,同样的,EVERY 2 WEEK STARTS CURRENT_TIMESTAMP + '6:15'

HOUR_MINUTE表示从现在开始6:15后每2个星期,不指定STARTS则表示STARTS CURRENT_TIMESTAMP ,为时间指定

的操作从现在开始执行

every和end两个选项.timestamp值后是ends,他告诉mysql停止执行.你也可以用ends+ INTERVAL interval ,
比如EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP +

INTERVAL 4 WEEK 表示从现在起开始三十分钟后开始每十二个小时执行一次,从现在起四个星期后结束.不用

ends关键字表示事件持续到不确定什么时候结束地执行.
在every子句中STARTS, ENDS你可以两个都用,也可以都不用.

ON SCHEDULE 子句表示创建mysql函数和包含timestamp 或者interval 值的用户变量.在这样的表达式中你不

能用存储程序或者用户自定义的函数,也不能用任何参照表,无论如何,你可以用SELECT FROM DUAL,他要用

CREATE EVENT 和ALTER EVENT 声明,从MySQL 5.1.13开始,参照存储程序,用户自定义函数,表中明确不接受
通常,一旦一个event已经到期,它会立刻结束,你可以用 ON COMPLETION PRESERVE覆盖他,用ON COMPLETION

NOT PRESERVE 仅仅明确使缺省行为不再持续执行
你也可以用 DISABLE 关键字创建一个停止行为执行的事件,或者用ENABLE关键字这个行为称为默认的状态
他们经常用在ALTER EVENT 子句中
用COMMENT给一个事件一个注释,用任何64个字符来描述这个事件

DO子句由sql语句组成,你可以用任何有效的sql语句,存储程序,甚至是一个计划执行的event,比如下面的

e_hourly 事件表示每一个小时删除sessions表中的所有行一次,是site_activity 这个计划任务的一部分
CREATE EVENT e_hourly
    ON SCHEDULE
      EVERY 1 HOUR
    COMMENT 'Clears out sessions table each hour.'
    DO
      DELETE FROM site_activity.sessions;

当mysql存储系统变量 sql_mode 设置被创建和执行事件的设置生效
这个设置生效就经常执行,不管当前服务器的sql mode

SHOW 和select 即你今年返回一个没有起作用的结果
do子句可以用begin和end来包含多个sql 语句,如:
DELIMITER |

CREATE EVENT e_daily
    ON SCHEDULE
      EVERY 1 DAY
    COMMENT 'Saves total number of sessions then clears the table each day.'
    DO
      BEGIN
        INSERT INTO site_activity.totals (when, total)
          SELECT CURRENT_TIMESTAMP, COUNT(*)
            FROM site_activity.sessions;
        DELETE FROM site_activity.sessions;
      END |

DELIMITER 表示改变声明的分隔符
有的用在存储程序和event中的as,如:用一个本地变量,一个错误的handler,一个流控制的创造
DELIMITER |

CREATE EVENT e
    ON SCHEDULE
      EVERY 5 SECOND
    DO
      BEGIN
        DECLARE v INTEGER;
        DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;

        SET v = 0;

        WHILE v < 5 DO
          INSERT INTO t1 VALUES (0);
          UPDATE t2 SET s1 = s1 + 1;
          SET v = v + 1;
        END WHILE;
    END |

DELIMITER ;
没有方法直接用event传递参数,但是仍然可以用参数调用存储程序.如:
CREATE EVENT e_call_myproc
    ON SCHEDULE
      AT CURRENT_TIMESTAMP + 1 DAY
    DO CALL myproc(5, 27);

如果event的定义者拥有SUPER 特权,这个event即拥有读写全局变量的权限,因为授予这种特权会有潜在的危

险,慎重之!

分享到:
评论

相关推荐

    详解MySQL用事件调度器Event Scheduler创建定时任务

    在MySql中,创建一个新的调度器使用CREATE EVENT,其语法规则如下: CREATE [DEFINER = { user | CURRENT_USER }] EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] ...

    mysql触发器之创建使用触发器简单示例

    本文实例讲述了mysql触发器之创建使用触发器。分享给大家供大家参考,具体如下: 我们可以可以使用CREATE TRIGGER语句创建一个新的触发器,来看下具体的语法: CREATE TRIGGER trigger_name trigger_time trigger_...

    MySQL触发器使用详解

    在MySQL中,创建触发器语法如下: 代码如下: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 其中: trigger_name:标识触发器名称,用户自行指定; trigger_...

    MySQL触发器基本用法详解【创建、查看、删除等】

    1、MySQL触发器的创建语法: CREATE [DEFINER = { 'user' | CURRENT_USER }]  TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW [trigger_order] trigger_body 2、MySQL创建语法...

    MYSQL事件查看器使用介绍

    创建事件 语法: CREATE EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE] [COMMENT ‘comment’] DO sql_statement; 实例: CREATE EVENT ...

    MySQL中触发器入门简单实例与介绍

    CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 其中trigger_name标识触发器名称,用户自行指定; trigger_time标识触发时机,用before和after替换; trigger_...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。  拉里•埃里森  就业前景 从就业与择业的...

    asp.net知识库

    Create Tables and Build inserts from Tables by using Mygeneration Templates(Sql Server) C# 获取数据库中某个某个表的创建脚本 DbHelperV2 - Teddy的通用数据库访问组件设计和思考 也论该不该在项目中使用...

    韩顺平oracle学习笔记

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\App lication这个里面所有有oracle这个字眼的,删除 4、删除c盘\Program Files\Oracle...

    Java学习笔记-个人整理的

    {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{subsection.1.3.1} {1.4}数据类型}{23}{section.1.4} {1.4.1}整数与浮点数}{23}{...

Global site tag (gtag.js) - Google Analytics