Mysql中event任務調度,定時掃描數據,根據相關業務,更新數據

寫在前面

這裏記錄下,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
		);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章