【问题标题】:Add value to a column each month in Mysql Data Base每月在 Mysql 数据库中为一列添加值
【发布时间】:2015-08-30 08:18:01
【问题描述】:

有没有办法使用预定义的值自动更新 Mysql DB 中表中列的值,并且应该每月更新一次。

情况是我想更新表员工中的列余额,每个员工每月增加 2.5 天,并且每个员工的总天数应该每两年重置一次。

【问题讨论】:

  • 使用 PHP、Python 或其他语言的编程脚本来执行此操作,而不是存储过程或触发事件。数据库应该从业务逻辑中抽象出来。它们必须与仅用于存储和保护关系数据的应用程序无关。

标签: mysql sql


【解决方案1】:

数据库并不是这样工作的。它们用于存储信息。您可以编写触发器,因此如果您更新行或插入,则会发生事件,但除此之外数据不会更改

这样的事情应该在应用程序逻辑中处理。创建一个 cron 或其他定期作业,将抓取在 X 日期创建的行并更新它们

【讨论】:

  • 是否可以使用 Create Event 语句?
  • 我会对此进行研究,我认为它会解决问题
【解决方案2】:

考虑使用 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

【讨论】:

  • @Drew 感谢您的解释,我想知道什么更好,创建一个 cron 作业或使用创建事件,如果我关闭我的应用程序并在两个月后启动它,cron 会用两个月的值更新?我真的很困惑
  • 如果你关掉什么? mysql数据库确实是问题所在。 mysql 是否正在运行,人们是否可以连接(包括 cron),是否像我的答案中那样打开或关闭事件。当您说应用程序时,这意味着什么,例如 Web 服务器?无论如何,基本上是我在这个小盒子里和答案中所说的。 IMO,您可以在 db 内部执行的任何不涉及 crontab 的操作,都很不错。
  • 感谢您让我走上正确的道路,我对自己要做什么有清晰的认识:)
  • 听起来不错。当你找到最适合你的答案时,给它一个绿色的复选标记。稍等片刻,可能还有其他好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2013-10-25
  • 1970-01-01
  • 2016-09-12
  • 2011-10-22
  • 2019-09-14
相关资源
最近更新 更多