MySQL定时调度器的使用(先定义一个函数(函数内含多条更新语句),再定义一个event事件调用该函数) 您所在的位置:网站首页 mysql调用函数 MySQL定时调度器的使用(先定义一个函数(函数内含多条更新语句),再定义一个event事件调用该函数)

MySQL定时调度器的使用(先定义一个函数(函数内含多条更新语句),再定义一个event事件调用该函数)

#MySQL定时调度器的使用(先定义一个函数(函数内含多条更新语句),再定义一个event事件调用该函数)| 来源: 网络整理| 查看: 265

MySQL定时调度器的使用 一、想实现的功能:二、使用步骤:三、拓展:四、补充:五、常用代码备份:六、执行SELECT * FROM mysql.event; 查出的event字段中,last_executed、starts、ends字段为什么显示的时间与我们设定的少8个小时?

推荐相关博文:mysql的定时调度器(内含多条与定时调度器相关的常用查询语句以及使用例子)

一、想实现的功能: 我想每隔5分钟执行一次event事件,事件的功能是每隔5分钟更新某张表的状态字段。(比如:系统执行一次event事件,当检查到距离开始时间这个字段还有半小时,会自动更新状态字段,把“未开始”替换成“即将开始”状态)查了百度,比较好的方法是创建一个函数,再创一个event事件。函数里含多条我们写的update语句,且该函数名称记为update_state()。event事件就专门用call update_state()运行该函数即可。 二、使用步骤: 先在my.ini配置文件中设置永久开启时间控制器event_scheduler = ON并重启mysql。(配置步骤详见:MySQL正确配置my.ini的event_scheduler = ON)创建一个函数,名为update_state,创建步骤如下:

在这里插入图片描述 在这里插入图片描述 ↑↑↑如果上面设置了要传入的参数,但是等下要写的函数体没有出现该参数,保存时会报1064错误,错误信息说第一行出错,但我们的代码并没有写错,它在提醒你注意补充之前你设置的参数而已,错误提示信息如下:

1064 - You have an error in your SQLsyntax;check the manual that corresponds to your MySQL server version for the right syntax to use near ')

下一步紧接着: 在这里插入图片描述点击完成后,需要我们定义函数体,我们把三条update语句依次写入:

BEGIN #将距离开始时间还有半个小时(1800s)的记录状态从0改为1 UPDATE `schedule` SET s_state='1' WHERE timestampdiff(SECOND,current_timestamp,s_starttime) BETWEEN 0 AND 1800 AND s_state='0'; #将位于开始时间和结束时间之间且状态为1的记录改变其状态为2 UPDATE `schedule` SET s_state='2' WHERE timestampdiff(SECOND,current_timestamp,s_starttime) 0 AND s_state='1'; #将已经过了结束时间的记录从状态2改为3 UPDATE `schedule` SET s_state='3' WHERE timestampdiff(SECOND,current_timestamp,s_endtime) 0进行判断 IF ROW_COUNT()>0 THEN statement_list END IF

推荐相关博文:SQL返回受影响行数 自己动手试试能不能实现该功能,博主偷懒就不实现了,下面给你们演示在函数体中使用ROW_COUNT()统计函数体执行后所有受影响的行数值n,并返回值n,补充update_state()函数体,如下↓(注意我把每个update的判断条件改成不等于了,这样比较完善):

BEGIN #定义变量n,类型为INTEGER,默认值为0 declare n INTEGER DEFAULT 0; #将距离开始时间还有半个小时(1800s)的记录状态改为1 UPDATE `schedule` SET s_state='1' WHERE timestampdiff(SECOND,current_timestamp,s_starttime) BETWEEN 0 AND 1800 AND s_state '1'; set n=ROW_COUNT()+n; #将位于开始时间和结束时间之间的记录改变其状态为2 UPDATE `schedule` SET s_state='2' WHERE timestampdiff(SECOND,current_timestamp,s_starttime) 0 AND s_state '2'; set n=ROW_COUNT()+n; #将已经过了结束时间的记录状态改为3 UPDATE `schedule` SET s_state='3' WHERE timestampdiff(SECOND,current_timestamp,s_endtime)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有