`

【转】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-Events-CN[定义].pdf

    CREATE EVENT 语句用于创建一个新的事件,语法如下: CREATE EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] DO event_body; 其中,event_name 是事件的名称,schedule ...

    MySQL语法大全

    创建触发器:`CREATE TRIGGER trigger_name BEFORE|AFTER event ON table_name FOR EACH ROW BEGIN SQL_statements; END;` 十五、备份与恢复 MySQL提供了备份和恢复工具,如`mysqldump`用于创建数据库的SQL脚本备份...

    MySQL定时执行脚本(计划任务)命令实例

    在MySQL中,这一功能主要通过`EVENT`来实现。 首先,你需要确保MySQL的事件调度器(Event Scheduler)是开启状态。你可以通过执行以下查询来检查: ```sql SHOW VARIABLES LIKE '%sche%'; ``` 如果`event_...

    mysql练习复习最佳帮手

    - **语法形式**:`CREATE TABLE table_name (column1 datatype, column2 datatype, ...);` - **设置主键**:`PRIMARY KEY(column_name)` - **设置外键**:`FOREIGN KEY(column_name) REFERENCES referenced_table...

    mysql中event的用法详解

    MySQL中的Event是数据库管理系统提供的一种时间触发机制,它允许用户安排一次或定期执行SQL语句或存储过程。从MySQL 5.1版本开始引入,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触发器的作用及语法详解 #### 一、触发器的概念 触发器是一种特殊类型的存储过程,它在特定的数据库事件(如数据插入、更新或删除)发生时自动执行。触发器增强了数据库的安全性和完整性控制,能够实现比...

    数据库原理及应用MySQL-触发器部分的知识点整理

    CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt ``` 参数说明: - trigger_time:触发时间,before或after。 - trigger_event:触发事件,insert、update或delete...

    MySQL计划任务(事件调度器) Event Scheduler介绍

    创建事件(CREATE EVENT)的基本语法如下: ```sql CREATE EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE] [COMMENT 'comment'] DO sql_statement; ``...

    mysql中经典的触发器语法及相关配置

    ### MySQL中的经典触发器语法及相关配置 #### 一、触发器概述 触发器是一种数据库对象,它被设计用于监视特定的事件并在这些事件发生时自动执行预定义的操作。触发器通常用于实现复杂的业务规则或者数据完整性约束...

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

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

    mysql事件之修改事件(ALTER EVENT)、禁用事件(DISABLE)、启用事件(ENABLE)、事件重命名及数据库事件迁移操作详解

    一个基本的ALTER EVENT语法如下: ```sql ALTER EVENT event_name ON SCHEDULE schedule ON COMPLETION [NOT] PRESERVE RENAME TO new_event_name ENABLE | DISABLE DO event_body; ``` - `event_name` 是要修改的...

    快速消费品数据分析mysql测试题-mysql.docx.docx

    9. 创建触发器的语法大致为:`CREATE TRIGGER trigger_name ON table_name FOR|AFTER|BEFORE event ACTION [BEGIN] SQL_statements [END]`. 程序阅读与填空题: 根据 `Esc_goods` 表数据,例如查询商品名称为 '...

    [数据库] Navicat for MySQL触发器更新和插入操作1

    【数据库】Navicat for MySQL 是一款常用的数据库管理工具,特别适合MySQL数据库的管理和开发。在MySQL中,触发器(Trigger)是一种强大的功能,用于在特定的数据操作(如INSERT、UPDATE、DELETE)发生时自动执行预...

    MySQL定时器EVENT学习笔记

    MySQL定时器EVENT是一种非常实用的功能,它允许数据库管理员在预设的时间执行特定的任务,比如定期备份、清理过期数据或执行维护操作。在MySQL中,EVENTs被设计为数据库级别的对象,可以在不需要用户干预的情况下...

    第12章MySQL触发器与事件.docx

    - 创建事件的语法:`CREATE EVENT event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'comment'] DO event_body;` - 修改事件:`ALTER EVENT ...

    老生常谈mysql event事件调度器(必看篇)

    CREATE EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'string'] DO event_body; ``` 事件一旦被创建,就可以...

    mysql学习资料整理

    - **创建定时器**: `create event 事件名 on schedule at '2023-09-01 12:00:00' do begin ... end;` - **定时器用途**: 可以用于定期备份数据库、清理日志等任务。 **5. 主从复制(Master-Slave Replication)** - ...

    Oracle向MySQL_迁移相关事项

    在Oracle中创建存储过程的CREATE OR REPLACE语句在MySQL中需要调整,赋值语句也有所改变。例如,Oracle的赋值操作符":"在MySQL中变为"="。 四、任务(Job)的移植 Oracle的Job对应MySQL的Event,用于实现定时任务。...

Global site tag (gtag.js) - Google Analytics