写在前面

这里记录下,Mysql 任务调度
处理场景:根据构建的初始数据,某条件,自动更新数据状态

一、代码示例

  • 查看是否开启 event_scheduler
  • 定义存储过程
  • 定义 event_scheduler
  • 启动 event_scheduler

详细如下

# 数据库系统管理,仅供参数设置,查询,业务数据,可另新建控制台
SHOW VARIABLES LIKE 'event_scheduler';
SET GLOBAL event_scheduler = 1;

SELECT CURRENT_USER(), SCHEMA();

SHOW EVENTS from cadip_control;

SHOW PROCEDURE STATUS WHERE db = 'cadip_control' ;

SELECT
	routine_name,CREATED,LAST_ALTERED,ROUTINE_BODY,SQL_MODE,DTD_IDENTIFIER,ROUTINE_CATALOG,ROUTINE_SCHEMA,ROUTINE_TYPE
FROM
	information_schema.routines
WHERE
		routine_type = 'PROCEDURE'
  AND routine_schema = 'cadip_control';


SELECT SYSDATE(); -- -- 2020-05-10 12:14:13
SELECT NOW();  -- 2020-05-10 12:14:13

SELECT CURTIME() -- 12:13:43

-- 定义存储过程

DELIMITER |

DROP PROCEDURE IF EXISTS update_ope_status |

CREATE PROCEDURE update_ope_status ()
BEGIN

	IF EXISTS(
			SELECT info.system_id
			FROM operation_system_info info
			WHERE info.`status` = '0'
			  AND SYSDATE() <= info.be_ready_date
		) THEN
		UPDATE operation_system_info info
		SET info.`status` = '1'
		WHERE info.system_id IN (
			SELECT system_id
			FROM (
					 SELECT system_id
					 FROM operation_system_info
					 WHERE STATUS = '0'
					   AND SYSDATE() <= be_ready_date
				 ) t
		);
	END IF ;
END |

DELIMITER ;



-- 创建定时器,每间隔 10 秒调用一次存储过程。
DELIMITER //
CREATE EVENT  event_ope_status
	ON SCHEDULE EVERY 10 second  do
	begin
		call update_ope_status();
	end //
DELIMITER ;


-- 启动定时器
ALTER EVENT event_ope_status  ON
	COMPLETION PRESERVE ENABLE;


-- 自定义调用存储过程
call update_ope_status();

1.2、注意点

要注意存储过程中的 sql 写法,不支持直接子查询,如下

UPDATE operation_system_info info
		SET info.`status` = '1'
		WHERE info.system_id IN (
					 SELECT system_id
					 FROM operation_system_info
					 WHERE STATUS = '0'
					   AND SYSDATE() <= be_ready_date
		);

可自定义子查询别名,解决上述问题

UPDATE operation_system_info info
		SET info.`status` = '1'
		WHERE info.system_id IN (
			SELECT system_id
			FROM (
					 SELECT system_id
					 FROM operation_system_info
					 WHERE STATUS = '0'
					   AND SYSDATE() <= be_ready_date
				 ) t
		);