什么是“MySQL事件”?

13
什么是“MySQL事件”?它的目的是什么?它与“作业调度器”有何不同?
许多在SO上的帖子和MySQL文档都描述了如何实现MySQL事件,但我只对它们的目的感兴趣。

你为什么认为这应该与“作业调度程序”不同呢? - Konerak
2个回答

18

MySQL事件提供了一种替代“定时任务”和“cron作业”的方法。

事件可用于创建备份、删除过期记录、聚合数据以进行报告等。与标准触发器不同,后者在给定条件下执行,事件是一个由时间流逝触发的对象,有时被称为时间触发器。

请参考下面的链接,其中解释了所有内容:

http://phpmaster.com/working-with-mysql-events/


1
谢谢 Teez - 很好的答案 :). 另外一个问题,听起来 MySQL 事件只能执行 SQL 命令。如果我想要执行 PHP 脚本,你知道一个好的工作调度程序吗? - Don P
3
感谢提供 PHPmaster 链接,非常有帮助。 - Don P
假设我允许用户在7天内编辑一个可在数据库中进行编辑的事物(其editable=true)。设置MySQL事件在7天后将editable=false是否是适当的用法?或者它只应用于批处理等操作? - hytromo

0
一个事件是MySQL中的一个预定任务。*文档详细解释了事件。
例如,您可以按照下面的示例创建test表:
CREATE TABLE test (
  num int
);

然后,您将插入下面所示的num1的行:
INSERT INTO test (num) VALUES (1);

现在,您可以创建一个名为plus_one的事件,从2023-11-15 00:00:00开始,每秒将1加到num中,如下所示。*CREATE EVENT语句必须有DO语句,并且DO语句必须至少有一条SQL语句,否则会出现错误。如果2023-11-15 00:00:00已经过去,那么在创建plus_one事件后立即开始每秒将1加到num中,基本上,您需要在创建事件时将默认分隔符;更改为类似$$的内容,否则会出现错误,然后在创建事件后,您需要将分隔符$$更改回;,如下所示,我的答案解释了分隔符,创建事件时必须选择一个数据库,否则会出现错误
DELIMITER $$

CREATE EVENT plus_one
ON SCHEDULE EVERY 1 SECOND
STARTS '2023-11-15 00:00:00'
DO 
BEGIN
UPDATE test SET num = num + 1;
END$$

DELIMITER ;

然后,您可以检查plus_one事件每秒将1添加到num,如下所示:
mysql> SELECT num FROM test;
+------+
| num  |
+------+
|  23  |
+------+
...
mysql> SELECT num FROM test;
+------+
| num  |
+------+
|  61  |
+------+

小心,即使你设置了用户定义的会话变量,例如@my_value1,然后在事件中使用它,如下所示:
SET @my_value = 1;

DELIMITER $$

CREATE EVENT plus_one
ON SCHEDULE EVERY 1 SECOND
STARTS '2023-11-15 00:00:00'
DO
BEGIN
UPDATE test SET num = @my_value; -- Here
END$$

DELIMITER ;

然后,如下所示,@my_valueNULL
mysql> SELECT @my_value; 
+----------------------+
| @my_value            |
+----------------------+
| NULL                 |
+----------------------+

即使您在事件中定义了用户自定义会话变量the user-defined session variable,例如@my_value,并将其设置为Hello,也是如此。
DELIMITER $$

CREATE EVENT my_event
ON SCHEDULE EVERY 1 SECOND
STARTS '2023-11-15 00:00:00'
DO
BEGIN
SET @my_value = "Hello"; -- Here
END$$

DELIMITER ;

然后,如下所示,@my_valueNULL
mysql> SELECT @my_value; 
+----------------------+
| @my_value            |
+----------------------+
| NULL                 |
+----------------------+

此外,在下面的情况中,您可以创建一个名为plus_one的事件,而无需更改分隔符为$$,也不会出现错误。
CREATE EVENT plus_one
ON SCHEDULE EVERY 1 SECOND
STARTS '2023-11-15 00:00:00'
DO 
UPDATE test SET num = num + 1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接