创建事件时使用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事件在执行中断后,下一次继续执行时会从中断的地方继续执行,而不是从头开始执行。这对于事件的执行效率和正确性都非常有帮助。
极客笔记