DATETIME过去后如何触发MySQL查询

时间:2016-12-15 20:06:41

标签: mysql sql datetime

晚上好,

我有一个表,我存储一个类型为:datetime的元素, 我将通过php上的脚本在此元素中插入日期。

当达到日期时,我想增加" datepast"来自table2, 我们可以通过比较" name"从table1到" person_name"来自table2。

现在问题是如何触发一个sql脚本为我做这个工作,如果它是实时的话会很棒。

已经感谢了,     

create table if not exists table1 ( name varchar(64) NOT NULL,
finishtime DATETIME, id_table1 int NOT NULL AUTO_INCREMENT, primary key ( id_table1 ));

create table if not exists table2 ( person_name varchar(64) NOT NULL,
datepast int, id_table1 int NOT NULL AUTO_INCREMENT, primary key ( id_table1 ));

2 个答案:

答案 0 :(得分:0)

您可以使用MySQL事件或Cronjob。这不是实时的,但它可以接近。

由于您的发布未完成且缺少table2,我只能举例说明如何设置事件。在DO BEGIN and END $$内,您可以添加MySQL查询以更新datepast。

DELIMITER $$
CREATE 
EVENT `increase_date_past` 
ON SCHEDULE EVERY 30 SECOND
DO BEGIN
{{READ DATE AND UPDATE TABLE2}}
END $$
DELIMITER ; 

默认情况下不会激活事件,您必须转到

In /etc/mysql/my.cnf

并在[mysqld]标记内放置一行来激活事件。

[mysqld]
event_scheduler=1

然后sudo service mysql restart

答案 1 :(得分:0)

Cronjobs和MySQL事件可以很好地处理这些事情。但是你在那里放置的查询必须设置为幂等的 - 也就是说,必须设置它们,这样如果你不止一次运行它们,它们就像运行它们一样具有相同的效果。否则你将有一个脆弱的解决方案。

当您根据finishtime等过期时间处理数据时,尝试使用查询或视图通常是个好主意,而不是更新。

例如,您可以创建此视图

CREATE OR REPLACE VIEW table2 AS
 SELECT name      AS person_name
        COUNT(*)  AS datepast
   FROM table1
  WHERE datepast <= NOW()
  GROUP BY name

然后,SELECT * FROM table2将生成与SELECT person_name, datepast FROM table2可能生成的结果集相同的结果集。但SELECT结果集将始终精确准确。

等等!你说,效率不高吗?答案是,除非你的table中有几十万行或更多,否则可能不会。 SQL是为这种声明性数据构建的。