• Mysql中event事件的入门


    Mysql中event事件的入门


    主要涉及的知识点:mysql的存储过程、mysql的event事件调度。

    参考资料: 

    Qiao_Zhi的博客:【周期性执行事件】MySQL事件(Event)&任务调度

    起风了的博客:mysql存储过程查询结果循环遍历 判断 赋值 游标等基本操作

    webbc的文章:MySQL游标概念与用法详解

    的博客:mysql游标的用法及作用

    的博客:MySql 游标的使用(二)FETCH INTO取出来的部分字段为NULL

    的博客:Mysql Event Scheduler不执行


    直接示例:

    假如要实现这样一个场景,购买订单生成后,三十分钟未支付,自动更新订单状态,并返还商品库存。

    存储过程示例:

    delimiter //
    DROP PROCEDURE IF EXISTS  `updateOrderStatus` //
    CREATE PROCEDURE updateOrderStatus()
    BEGIN
    DECLARE order_id int DEFAULT 0;
    DECLARE goods_id int DEFAULT 0;
    DECLARE done int DEFAULT 0;
    DECLARE overtime_order CURSOR FOR select id,shop_id from `order` where `status`='等待支付' and `order_time`<=(unix_timestamp(now())-1800);
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
    OPEN overtime_order;
            read_loop:LOOP
            FETCH overtime_order into order_id,goods_id;
            if done = 1 THEN
            leave read_loop;
            END IF;
            update `order` set `status` = '未支付',order_end_time=now() where `id`=order_id;
            update `shop` set `num` = `num`+1 where `id`=goods_id;
            END LOOP;
    CLOSE overtime_order;
    END //
    delimiter ;

    event事件调度示例:

    drop event if exists event_update_order;
    CREATE event event_update_order
    ON SCHEDULE EVERY 1 MINUTE
    DO CALL updateOrderStatus();

    知识点:

    (1)修改sql默认的以【分号;】结束为【//】: delimiter //

    (2) 创建存储过程前先查看下是否已存在:show create procedure updateOrderStatus;

      或存在先删除:DROP PROCEDURE IF EXISTS `updateOrderStatus`;

    (3)创建event事件前先查看下是否已存在:show create event event_update_order;

      或存在先删除:drop event if exists event_update_order;

    (4)mysql的event事件调度程序默认是关闭的。

      查看event是否开启:
    mysql> SHOW VARIABLES LIKE 'event_scheduler';
    +-----------------+-------+
    | Variable_name | Value |
    +-----------------+-------+
    | event_scheduler | OFF |
    +-----------------+-------+
    1 row in set (0.01 sec)

    开启:

    SET GLOBAL event_scheduler=on;

    (5)存储过程中定义的变量不能和数据表中的字段名重名,不然取不到值。

    (6)查看调度器线程:show processlist;

    (7)在存储过程中这样定义变量:DECLARE order_id int DEFAULT 0;

    (8)当存在多个数据需要循环时,可以用到游标,

      //创建游标,并存储数据
      declare user_data  CURSOR for
        select id,name from user where id<10;

      //创建变量,标识游标是否结束
      declare done INT DEFAULT 0;

      //当游标中的内容执行完后将done设置为1,说明循环游标结束
      declare CONTINUE HANDLER FOR NOT FOUND SET done=1;
      //打开游标
      open user_data;
      //执行循环 

      read_loop:LOOP 

      //判断是否结束循环
      IF done=1 THEN

        LEAVE read_loop;//跳出循环  
      END IF;
        //取游标中的值
        FETCH user_data into user_id,user_name;
        //执行增删改查操作
        insert ...;

        delete ...;

        update ...;

        select ...;

      END LOOP read_loop;
      //释放游标
      CLOSE user_data;


  • 相关阅读:
    华三SNMP配置详解
    华三交换机命令
    帧中继笔记
    分解企业园区网各模块所需的技术
    用 Python 写个坦克大战
    我给这个Python库打101分!
    用Python绘制一套“会跳舞”的动态图形给你看看
    Python异常处理
    python分析BOSS直聘的某个招聘岗位数据
    90行代码让微信地球转起来,太酷了!(python实现)
  • 原文地址:https://www.cnblogs.com/gyfluck/p/11476888.html
Copyright © 2020-2023  润新知