寫在前面
這裏記錄下,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
);