数据库中一些有关于时间的数据,需要动态调整,但从代码角度未免比较麻烦,不如直接从数据层面进行设置:推荐使用 事件
1、开篇碎碎念:
今天在写项目时,偶然发现部分数据需要依据时间实现状态同步。比如活动当前的状态,
2、解决思路:
(1)触发器:不推荐
CREATE TRIGGER update_activity_status -- 触发器名称
BEFORE UPDATE ON activity_info -- 所在表格
FOR EACH ROW
BEGINIF NEW.act_statue <> 4 THEN -- 只有当 act_status 不为 4 时才进行后续判断-- act_statue 为我数据库中的属性IF NEW.act_start_time > CURRENT_TIMESTAMP THEN SET NEW.act_statue = 1; -- 未开始ELSEIF NEW.act_end_time < CURRENT_TIMESTAMP THENSET NEW.act_statue = 3; -- 已结束ELSESET NEW.act_statue = 2; -- 进行中END IF;END IF;
END;
但,这个只能在更新的时候才能生效,我希望是按一定时间来自动更新
(2)事件:推荐。
CREATE EVENT update_activity_status_daily
ON SCHEDULE EVERY 1 DAY -- 设置发生的间隔周期
STARTS CURRENT_TIMESTAMP -- 当前时间
DO
BEGINUPDATE activity_infoSET act_statue = CASEWHEN act_statue IN (1, 2, 3) THENCASEWHEN act_start_time > CURRENT_TIMESTAMP THEN 1 -- 未开始WHEN act_end_time < CURRENT_TIMESTAMP THEN 3 -- 已结束ELSE 2 -- 进行中ENDELSE act_statue -- 保持不变END;
END;
默认一天后,自动变化,设置后立即生效,如下图:
事件在navicate中的位置:
双击可对该事件进行触发时间等的调整。