我想知道是否有什么办法可以安排更新,即在旧数据过期时更新表数据。
例如约翰·史密斯(John Smith)在X公司有一个现役服务,但想升级该服务。但是,由于他当前协议的限制,这项新服务要等X天后才能生效。
有什么方法可以存储新数据并在一个月末在MySQL中对其进行更新?如果是,这是否需要我再存储一张包含新订单数据的表?
答案 0 :(得分:0)
有趣的是,mysql的事件调度程序可以查看documentation。
下面是一个最小的CREATE EVENT语句的示例:
CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
UPDATE myschema.mytable SET mycol = mycol + 1;
上一条语句创建一个名为myevent的事件。通过运行一条使myschema.mytable表的mycol列的值增加1的SQL语句,此事件在创建后一小时内执行一次。
如果是,这是否需要我再存储一张包含新订单数据的表
我不确定您是否需要另一个表...这完全取决于您希望它成为一个表
答案 1 :(得分:0)
通常,通过在start_date
表中放置end_date
和services
列来满足将来更改事物的要求。
然后您可以使用
找到当前处于活动状态的服务行 SELECT user_id, whatever, whatelse
FROM services
WHERE (start_date IS NULL OR start_date <= NOW())
AND (end_date IS NULL OR end_date > NOW());
如果愿意,可以创建一个名为active_services
的视图,以自动过滤当前活动服务的services
表。
CREATE VIEW active_services AS
SELECT *
FROM services
WHERE (start_date IS NULL OR start_date <= NOW())
AND (end_date IS NULL OR end_date > NOW());
请注意-在这种设计中,end_date
包含不是服务激活的最后一刻,而是服务未激活的第一刻。如果end_date
为null,则该服务将继续处于活动状态。
要在下个月初更改服务或user_id
,请执行以下两项操作:
UPDATE service
SET end_date = LAST_DAY(NOW()) + INTERVAL 1 DAY
WHERE user_id = <<user id you wish to change >>
INSERT INTO service (start_date, user_id, whatever, whatelse)
VALUES (LAST_DAY(NOW()) + INTERVAL 1 DAY,
<<user id you wish to change >>,
<<whatever>>,
<<whatelse>>;
然后,下个月到达时,active_services
视图将返回新服务。这比依靠精确定时的每月工作要强大得多。如果您每月进行工作,则它可以随时运行。它只是清除过期的服务。
您可以使用MySQL事件在指定的时间运行特定的作业。 (但是某些共享的MySQL系统不允许您使用事件。)