mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间

为什么80%的码农都做不了架构师?>>>   hot3.png

    由于项目需要创建定时器(evevt),所以就百度了一下,发现基本都是来源于一个模板,有些功能还不全,现在自己总结一下。

注:mysql版本是从5.1开始才支持event的。如果你的版本低于5.1就先升级版本吧。

查看版本的方法有很多,这里只给大家提供一个    select version();

1.查看是否开启evevt与开启evevt。

1.1、MySQL evevt功能默认是关闭的,可以使用下面的语句来看evevt的状态,如果是OFF或者0,表示是关闭的。

              show VARIABLES LIKE '%sche%';

1.2、开启evevt功能

            SET GLOBAL event_scheduler = 1;

2.创建定时器的过程

2.1、创建测试表test
drop table if exists test;
create table test
(
id int(11) not null auto_increment primary key,
time datetime not null
) engine=innodb default charset=utf8;

2.2、创建evevt要调用的存储过程test_proce
delimiter //
drop procedure if exists test_proce//
create procedure test_proce()
begin
insert into test(time) values(now());
end//
delimiter ;

2.3、开启evevt(要使定时起作用,MySQL的常量GLOBAL event_scheduler必须为on或者是1)
执行show variables like 'event_scheduler';查看evevt是否开启;
若没开启执行set global event_scheduler='on';

2.4、创建事件test_event(其作用:每隔一秒自动调用test_proce()存储过程)
drop event if exists test_event;
create event test_event
on schedule every 1 second
on completion preserve disable
do call test_proce();
2.5、开启事件test_event
alter event test_event on completion preserve enable;
2.6、关闭事件test_event
alter event test_event on completion preserve disable;
2.7、查看表test
select * from test;

 

3.查看自己创建的event

如果要查看更加详细的信息,你需要root用户的授权,如果是你自己的数据库你可以用下面语句查看

select * from  mysql.event;

下面的我的evevt的查看结果

mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间

4.event的时间设置

设置event很简单,但是麻烦的是如何设置执行的时间,网上找了一些,自己总结了一下。

先看语句,如下面这个

     CREATE EVENT test_event ON SCHEDULE EVERY 1 DAY STARTS '2012-09-24 00:00:00'

     ON COMPLETION PRESERVE ENABLE DO CALL test_procedure();

EVERY 后面的是时间间隔,可以选 1 second,3 minute,5 hour,9 day,1 month,1 quarter(季度),1 year 

从2013年1月13号0点开始,每天运行一次

ON SCHEDULE EVERY 1 DAY STARTS '2013-01-13 00:00:00'

从现在开始每隔九天定时执行

ON SCHEDULE EVERY 9 DAY STARTS NOW() ;

每个月的一号凌晨1 点执行

on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour);

每个季度一号的凌晨1点执行

on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);

每年1月1号凌晨1点执行

on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);

 

其他的 就大家自由组合了。。

 

 

附录

 

1>使用权限

单独使用event调用SQL语句时,查看和创建需要用户具有event权限,调用该SQL语句时,需要用户具有执行该SQL的权限。Event权限的设置保存在mysql.user表和mysql.db表的Event_priv字段中。

当event和procedure配合使用的时候,查看和创建存储过程需要用户具有create routine权限,调用存储过程执行时需要使用excute权限,存储过程调用具体的SQL语句时,需要用户具有执行该SQL的权限。

 

查看EVENT命令有如下几种:

 

(1)查询mysql.event表;

(2)通过SHOW EVENTS命令;

(3)通过SHOW FULL EVENTS命令;

(4)通过查询information_schema.events表

(5)SHOW CREATE EVENT。

总之,event的使用频率较低建议使用root用户进行创建和维护。

 

2>CREATE EVENT 的语法

CREATE EVENT

[IF NOT EXISTS] ------------------------------------------------*标注1

event_name -----------------------------------------------------*标注2

ON SCHEDULE schedule -------------------------------------------*标注3 

[ON COMPLETION [NOT] PRESERVE] ---------------------------------*标注4

[ENABLE | DISABLE] ---------------------------------------------*标注5 

[COMMENT 'comment'] --------------------------------------------*标注6 

DO sql_statement ;----------------------------------------------*标注7

 

说明:

标注1:[IF NOT EXISTS]

       使用IF NOT EXISTS,只有在同名event不存在时才创建,否则忽略。建议不使用以保证event创建成功。

 

标注2:event_name

      名称最大长度可以是64个字节。名字必须是当前Dateabase中唯一的,同一个数据库不能有同名的event。

      使用event常见的工作是创建表、插入数据、删除数据、清空表、删除表。

      为了避免命名规范带来的不便,最好让事件名称具有描述整个事件的能力。建议命名规则如下为:

      动作名称_(INTO/FROM_)  表名_TIME,例如:

                                               1.每月创建(清空/删除)fans表: 

                                                                         create(truncate/drop)_table_fans_month;

                                               2.每天从fans表插入(删除)数据: 

                                                                         insert(delete)_into(from)_fans_day;

 

标注3:ON SCHEDULE

       ON SCHEDULE 计划任务,有两种设定计划任务的方式:

       1. AT 时间戳,用来完成单次的计划任务。

       2. EVERY 时间(单位)的数量时间单位[STARTS 时间戳] [ENDS时间戳],用来完成重复的计划任务。

 

       在两种计划任务中,时间戳可以是任意的TIMESTAMP 和DATETIME 数据类型,时间戳需要大于当前时间。

       在重复的计划任务中,时间(单位)的数量可以是任意非空(Not Null)的整数式.

       时间单位是关键词:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。

       提示: 其他的时间单位也是合法的如:

         QUARTER, WEEK,YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND

                  不建议使用上一行这些不标准的时间单位。

 

标注4: [ON COMPLETION [NOT] PRESERVE]

        ON COMPLETION参数表示"当这个事件不会再发生的时候",即当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而PRESERVE的作用是使事件在执行完毕后不会被Drop掉,建议使用该参数,以便于查看EVENT具体信息。

 

标注5:[ENABLE | DISABLE]

       参数Enable和Disable表示设定事件的状态。Enable表示系统将执行这个事件。Disable表示系统不执行该事件。

         可以用如下命令关闭或开启事件:

                                     ALTER EVENT event_name  ENABLE/DISABLE

 

标注6:[COMMENT 'comment']

        注释会出现在元数据中,它存储在information_schema表的COMMENT列,最大长度为64个字节。

        'comment'表示将注释内容放在单引号之间,建议使用注释以表达更全面的信息。

 

标注7: DO sql_statement

        DO sql_statement字段表示该event需要执行的SQL语句或存储过程。

        这里的SQL语句可以是复合语句,例如:

                                           BEGIN

                                           CREATE TABLE test1;//创建表(需要测试一下)

                                           DROP TABLE test2;//删除表

                                           CALL proc_test1();//调用存储过程

                                           END

使用BEGIN和END标识符将复合SQL语句按照执行顺序放在之间。当然SQL语句是有限制的,对它的限制跟函数Function和触发器Trigger 中对SQL语句的限制是一样的,如果你在函数Function 和触发器Trigger 中不能使用某些SQL,同样的在EVENT中也不能使用。明确的来说有下面几个:

                          LOCK TABLES

                          UNLOCK TABLES

                          CREATE EVEN

                          ALTER EVENT

                          LOAD DATA

 

3>执行逻辑

For (已建立事件each event that has been created)

If (事件的状态非DISABLE)

And (当前时间在ENDS时间之前)

And (当前时间在STARTS时间之后)

And (在上次执行后经过的时间)

And (没有被执行)

Then:

建立一个新的线程

传递事件的SQL语句给新的线程

(该线程在执行完毕后会自动关闭)

 

4>修改事件

 

使用ALTER EVENT 来修改事件,具体的ALTER语法如下,与创建事件的语法类似:

ALTER EVENT   event_name

ON SCHEDULE schedule

[RENAME TO new_event_name]

[ON COMPLETION [NOT] PRESERVE]

[ENABLE | DISABLE]

[COMMENT 'comment']

DO sql_statement;

 

5>删除事件

 

EVENT使用DROP EVENT语句来删除已经创建的事件,语法如下:

DROP EVENT  [IF EXISTS]  event_name;

 

但当一个事件正在运行中时,删除该事件不会导致事件停止,事件会执行到完毕为止。使用DROP USER和DROP DATABASE 语句同时会将包含其中的事件删除。

 

show procedure status;

 

MYSQL中存储过程的创建,调用及语法

(2011-12-01 16:19:46)

10103818_GuJa.gif转载

MySQL 存储过程是从 MySQL 5.0 开始增加的新功能。存储过程的优点有一箩筐。不过最主要的还是执行效率和SQL 代码封装。特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句。特别是业务逻辑复杂的时候,一大堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗。现在有了 MySQL 存储过程,业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高。

 

第一部分:创建一个简单的无参的存储过程

1 用mysql客户端登入

2 选择数据库

mysql>use test;

3 查询当前数据库有哪些存储过程

mysql>show procedure status where Db='test';
4 创建一个简单的存储过程
mysql>create procedure hi() select 'hello';
5 存储过程创建完毕,看怎么调用它
mysql>call hi();
  显示结果
  mysql> call hi();
+-------+
| hello |
+-------+
| hello |
+-------+
1 row in set (0.00 sec)Query OK, 0 rows affected (0.01 sec)
6 一个简单的储存过程就成功了,这只是一个演示,存储过程可以一次执行多个sql语句第二部分:创建一个有两个参数的存储过程一、MySQL 创建存储过程 “pr_add” 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 “a”、“b”,返回这两个参数的和。 
drop procedure if exists pr_add;-- 计算两个数之和create procedure pr_add(a int,b int)
begin
   declare c int;if a is null thenset a = 0;end if;if b is null thenset b = 0;end if;set c = a + b;select c as sum;
   end;
二、调用 MySQL 存储过程 call pr_add(10, 20);
执行 MySQL 存储过程,存储过程参数为 MySQL 用户变量。 set @a = 10;set @b = 20;call pr_add(@a, @b);三、MySQL 存储过程特点 创建 MySQL 存储过程的简单语法为: create procedure 存储过程名字()([in|out|inout] 参数 datatype
)beginMySQL 语句;end;MySQL 存储过程参数如果不显式指定“in”、“out”、“inout”,则默认为“in”。习惯上,对于是“in” 的参数,我们都不会显式指定。 1. MySQL 存储过程名字后面的“()”是必须的,即使没有一个参数,也需要“()” 
2. MySQL 存储过程参数,不能在参数名称前加“@”,如:“@a int”。下面的创建存储过程语法在 MySQL 中是错误的(在 SQL Server 中是正确的)。 MySQL 存储过程中的变量,不需要在变量名字前加“@”,虽然 MySQL 客户端用户变量要加个“@”。 
create procedure pr_add(@a int,  -- 错误b int    -- 正确)3. MySQL 存储过程的参数不能指定默认值。 4. MySQL 存储过程不需要在 procedure body 前面加 “as”。而 SQL Server 存储过程必须加 “as” 关键字。 create procedure pr_add(a int,b int)as              -- 错误,MySQL 不需要 “as”beginmysql statement ...;end;5. 如果 MySQL 存储过程中包含多条 MySQL 语句,则需要 begin end 关键字。 create procedure pr_add(a int,b int)beginmysql statement 1 ...;mysql statement 2 ...;end;6. MySQL 存储过程中的每条语句的末尾,都要加上分号 “;” 
   ...declare c int;if a is null thenset a = 0;end if;...end;7. MySQL 存储过程中的注释。 declare c int;     -- 这是单行 MySQL 注释 (注意 -- 后至少要有一个空格)if a is null then  # 这也是个单行 MySQL 注释set a = 0;end if;...end;8. 不能在 MySQL 存储过程中使用 “return” 关键字。 
   set c = a + b;select c as sum;end;9. 调用 MySQL 存储过程时候,需要在过程名字后面加“()”,即使没有一个参数,也需要“()” call pr_no_param();
10. 因为 MySQL 存储过程参数没有默认值,所以在调用 MySQL 存储过程时候,不能省略参数。可以用 null 来替代。 call pr_add(10, null);

转载于:https://my.oschina.net/lwaif/blog/821853

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

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

相关文章

音频视频

1.IOS视频播放代码(添加MediaPlayer.framework和#import) -(void)playMovie:(NSString *)fileName{//视频文件路径NSString *path [[NSBundle mainBundle] pathForResource:fileName ofType:"mp4"];//视频URLNSURL *url [NSURL fileURLWithP…

二分查找、变形及应用

[LeetCode] 35 Search Insert Position 题目 Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.You may assume no duplicates in the array. 测试案例 Input: […

linux内核怎么修改屏幕旋转方向_树莓派4—屏幕旋转

配置:树莓派4raspberry pi系统,HDMI显示,非触屏。问题:想将屏幕旋转90,按网上说的,方法一:在config.txt文件中添加display_rotate1,或者添加display_hdmi_rotate1,保存后…

周记随笔-php5.6与apache2.4的windows32安装

原材料:php.net , httpd.apache.org/download.cgi Apache的安装 ,在下载页面有依赖关系的说明 。 下载对应版本的压缩包,解压至目标目录,例如D盘根目录,首先修改配置 1 serverRoot: ServerRoot "c:/Apache24"…

独家直播!阿里移动前端开源框架Weex揭秘

或许你写过了很多行代码,修过许多的bug,学过各种各样的语言,却只在一个最好的时机遇见了他…… 是啥? 敲!黑!板!跟!我!念!Weex~~&…

python异常值处理实例_利用Python进行异常值分析实例代码

前言 异常值是指样本中的个别值,也称为离群点,其数值明显偏离其余的观测值。常用检测方法3σ原则和箱型图。其中,3σ原则只适用服从正态分布的数据。在3σ原则下,异常值被定义为观察值和平均值的偏差超过3倍标准差的值。P(|x−μ|…

MSSQL 发布订阅,实现读写分离

主库做增删改,从库只读。 大部分的数据库压力,都是由查询引起的,读写分离可以减轻数据库的压力。 1、在(主)数据库上对需要同步的数据进行发布。 2、在(从)数据库上对(主)数据库的发布进行订阅。 注:发布订阅都需要实际的服务器名…

php get为空,php – $_GET在url有变量时为空

我有一个看起来像这个reglph的文件?lang no_NO& passkey test并试图获取密码变量,但它一直显示为空白.当我尝试print_r($_ GET);它打印Array()?!怎么会发生这种情况?该网站看起来像这样print_r($_GET);include(..\libs\Smarty.class.php);?>A…

Block

1、认识Block Block封装了一段代码,可以在任何时候执行Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值,它和传统的函数指针很类似,但是有区别:block是inline(内联函数)的&#x…

坚持学习WF(8):本地服务之调用外部方法

WF提供了一组核心服务,例如在SQL 数据库中存储工作流实例的执行详细信息的持久性服务,计划服务,事务服务和跟踪服务。除了这些WF也提供了另外一种服务,叫做Local Service也可以叫做Data exchange service。主要是实现工作流和宿主…

c++归并排序_合并排序法

一、合并排序(Merge Sort) 就是将多个有序数据表合并成一个有序数据表。如果参与合并的只有两个有序表,那么称为二路合并。对于一个原始的待排序序列,往往可以通过分割的方法来归结为多路合并排序。二、一个待排序的原始数据序列进行合并排序的基本思路是…

golang json数组拼接

2016年06月16日 15:38:25 阅读数:2575 标签: golang json 数组 更多 个人分类: golang func main() {a : []byte({"Parents": [ "aaaaa", "bbbbbbb" ]})b : []byte({"Parents": [ "Gomez"…

php课程设计实验心得,PHP程序设计教程实验及课程设计

部分 教程1 基础教程1.1 简介1.2 WampServer安装1.3 PHP语法1.4 变量1.5 echo和print语句1.6 数据类型1.7 字符串函数1.8 常量1.9 运算符1.10 条件语句1.11 Switch语句1.12 循环语句1.13 函数部分 教程1 基础教程1.1 简介1.2 WampServer安装1.3 PHP语法1.4 变量1.5 echo和print…

DRUID连接池的简单使用

DRUID——为监控而生的DB池 1. DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池…

微习惯虽好,但是最重要的还是坚持

2019独角兽企业重金招聘Python工程师标准>>> “微习惯”一词是由美国的斯蒂芬盖斯提出的。他以前是个宅男,懒虫,为了改变自己而找到了这个方法。并且在自己身上实验成功。养成了好的读书、写作和健身的习惯,实现了人生的华丽转身。…

php手机端多图预览上传,JS实现多图预览上传的实例代码

这篇文章主要介绍了JS实现多张图片预览同步上传功能的相关资料,需要的朋友可以参考下废话不多说了,直接给大家贴代码了,具体代码如下所示:/*** Created by liujing on 2017/5/10.*/$(document).ready(function($) {function changef(which,bu…

带你了解zabbix整合ELK收集系统异常日志触发告警~

今天来了解一下关于ELK的“L”-Logstash,没错,就是这个神奇小组件,我们都知道,它是ELK不可缺少的组件,完成了输入(input),过滤(fileter),output(输…

用python设计学生管理系统_Python实现GUI学生信息管理系统

本文实例为大家分享了Python实现GUI学生信息管理系统的具体代码,供大家参考,具体内容如下 项目环境: 软件环境: OS:RedHat6.3 Lib:Pygtk Language:Python Support tool:Glade3 项目简述: ①Glade3设计用户的登录窗口,功…

http响应头设置

protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 设置响应头数据response.setHeader(null, "HTTP/1.1 200 OK");response.setHeader("Server", "Apache-Coyote/1.1"…

java用数组实现单词计数,MapReduce实现单词计数原理及Java编程:WordCount

MapReduce实现单词计数:WordCount单词计数的文本信息(hello.txt):hello can i help youi have a dreammaybe you can help me​ 实现过程:​ Map过程:并行读取文本,对读取的单词进行Map操作,每个词将会形成…