【发布时间】:2015-08-30 08:18:01
【问题描述】:
有没有办法使用预定义的值自动更新 Mysql DB 中表中列的值,并且应该每月更新一次。
情况是我想更新表员工中的列余额,每个员工每月增加 2.5 天,并且每个员工的总天数应该每两年重置一次。
【问题讨论】:
-
使用 PHP、Python 或其他语言的编程脚本来执行此操作,而不是存储过程或触发事件。数据库应该从业务逻辑中抽象出来。它们必须与仅用于存储和保护关系数据的应用程序无关。
有没有办法使用预定义的值自动更新 Mysql DB 中表中列的值,并且应该每月更新一次。
情况是我想更新表员工中的列余额,每个员工每月增加 2.5 天,并且每个员工的总天数应该每两年重置一次。
【问题讨论】:
数据库并不是这样工作的。它们用于存储信息。您可以编写触发器,因此如果您更新行或插入,则会发生事件,但除此之外数据不会更改
这样的事情应该在应用程序逻辑中处理。创建一个 cron 或其他定期作业,将抓取在 X 日期创建的行并更新它们
【讨论】:
考虑使用 mysql 的 Create Event 策略,它可以避免需要执行 cron 作业。
DELIMITER $$
CREATE EVENT monthlyAddFlexDaysEvent
ON SCHEDULE EVERY '1' MONTH
STARTS '2015-09-01 00:00:00'
DO
BEGIN
update empAccrued set daysAccrued=daysAccrued+2.5;
END$$
DELIMITER ;
DELIMITER $$
CREATE EVENT annualThingEvent
ON SCHEDULE EVERY '1' YEAR
STARTS '2016-01-01 00:00:00'
DO
BEGIN
-- perform some annual thing
END$$
DELIMITER ;
在任何情况下,您都可以做一些不属于年初的事情。例如根据员工周年日期处理更新的每周活动。
来自CREATE EVENT 的手册页,
interval: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND
正确设置事件以使其发生并监控它们很重要。
show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
糟糕,事件调度程序未打开。
好吧,我可以等一整天,事件甚至没有打开
SET GLOBAL event_scheduler = ON; -- turn her on
show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | ON |
+-----------------+-------+
按模式名称列出所有事件:
show events from so_gibberish;
或
show events\G; -- <--------- I like this one from mysql> prompt
show events; -- <--------- from workbench / sqlyog
*************************** 1. row ***************************
Db: so_gibberish
Name: set_trips_finished
Definer: GuySmiley@localhost
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 1
Interval field: MINUTE
Starts: 2015-08-23 00:00:00
Ends: NULL
Status: ENABLED
Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
【讨论】: