创建事件时使用ON COMPLETION PRESERVE子句有什么用?

创建事件时使用ON COMPLETION PRESERVE子句有什么用?

MySQL中的事件(Event)可以让我们在指定时间点执行某些操作,而ON COMPLETION PRESERVE是在创建事件时可以使用的一个子句。它的作用是什么呢?本文将介绍ON COMPLETION PRESERVE的用法和作用。

阅读更多:MySQL 教程

ON COMPLETION PRESERVE是什么?

ON COMPLETION PRESERVE是MySQL中创建事件时的一个子句,它的作用是保存事件的执行状态,如果事件在执行时中断了,下一次继续执行时会从中断的地方继续执行。如果不使用ON COMPLETION PRESERVE,在事件执行中断后,下一次执行时会从头开始执行。

示例代码

下面我将通过示例代码来演示ON COMPLETION PRESERVE的作用。首先我们创建如下两个表:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `logs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `event` varchar(50) DEFAULT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
);

接下来创建一个事件,在每隔5秒钟向users表中插入一条数据:

DELIMITER CREATE EVENT `insert_user`
ON SCHEDULE EVERY 5 SECOND
DO BEGIN    INSERT INTO `users` (`name`) VALUES (UUID());
    INSERT INTO `logs` (`event`) VALUES ('insert_user');
END
DELIMITER ;

然后执行下面的语句,中断执行:

SET GLOBAL event_scheduler = ON;

接着插入一条数据:

INSERT INTO `users` (`name`) VALUES (UUID());

可以发现,事件执行了一次后中断了,下一次执行事件时会从下一个时间点继续执行。

现在我们再创建一个使用ON COMPLETION PRESERVE的事件,每隔10秒钟向logs表中插入一条数据,并且中断执行:

DELIMITER CREATE EVENT `insert_logs`
ON SCHEDULE EVERY 10 SECOND
ON COMPLETION PRESERVE
DO BEGIN    INSERT INTO `logs` (`event`) VALUES ('insert_logs');
END
DELIMITER ;

这时候再设置event_scheduler为ON,下一次事件执行会从中断的地方继续执行,而不是从头开始执行。

结论

使用ON COMPLETION PRESERVE子句可以让MySQL事件在执行中断后,下一次继续执行时会从中断的地方继续执行,而不是从头开始执行。这对于事件的执行效率和正确性都非常有帮助。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程