我爱模板

当前位置: 我爱模板网 > 网络编程 > Mysql数据库教程 > 如何在MySQL中创建预定的事件

如何在MySQL中创建预定的事件

这是在关于第三个也是最后一个系列的文章数据库触发器和事件的自动化。如果你不这样做的话,请阅读如何在MySQL中创建触发器,它引入了许多这里讨论的概念 。

事件触发类似。然而,而不是在运行数据更改,事件可以预定运行在一个特定的时期的任何次数。实际上,它的一个数据库的cron作业。

自5.1版起事件已经在MySQL支持。他们是维护任务,如归档数据或报告的产生,它可以在非高峰时间预定的理想选择。

我们的数据库计划

我们的博客数据库有问题。旧文章被标记为删除,而不是从`博客`表中删除。我们的餐桌将无限增长,并随着时间的推移变得更慢。我们可以清除旧的职位,但会永远删除它们。因此,我们将移动的职位及相关的审计记录,存档表。存档表,可以在不影响主要的Web应用程序的速度增长,如果有必要,我们可以取消删除旧文章。

两个存档表是必需的:

`blog_archive`:`博客`表相同,除了它不需要一个删除标志或一个自动递增的ID。
`audit_archive`:`审计`除外表的时间戳相同是不是自动生成的,它并不需要一个自动递增的ID。
下面的SQL创建这两个表:


CREATE TABLE `blog_archive` (
`id` mediumint(8) unsigned NOT NULL,
`title` text,
`content` text,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Blog posts archive';
--
CREATE TABLE `audit_archive` (
`id` mediumint(8) unsigned NOT NULL,
`blog_id` mediumint(8) unsigned NOT NULL,
`changetype` enum('NEW','EDIT','DELETE') NOT NULL,
`changetime` timestamp NOT NULL,
PRIMARY KEY (`id`),
KEY `ix_blog_id` (`blog_id`),
KEY `ix_changetype` (`changetype`),
KEY `ix_changetime` (`changetime`),
CONSTRAINT `FK_audit_blog_archive_id` FOREIGN KEY (`blog_id`) REFERENCES `blog_archive` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

启动MySQL的事件调度

MySQL的事件是一个特殊的事件调度线程执行。这是默认情况下禁用,因此使用下面的MySQL命令可以判断它的运行:

SHOW PROCESSLIST;

如果调度程序正在运行,至少有两行显示和将其设置为“event_scheduler”的用户字段。如果只有一行返回,调度被禁用,事件将不会运行。

您可以确保调度程序启动时,MySQL的命令行选项启动-事件调度= ON或设置event_scheduler =在你的MySQL配置文件(Windows上的my.cnf或my.ini) 。

另外,你可以从MySQL命令行调度程序:

SET GLOBAL event_scheduler = ON;

创建事件

我们需要预定的事件:

从`博客``blog_archive`删除标志设置为1时,复制的职位。
复制相关的审计项目的审计``audit_archive`这些职位。
以物理方式删除存档`博客`表的职位。参照完整性已被定义外键,因此,所有这些职位相关的审计项目也将被删除。
假设你有MySQL的创建活动的权利,基本语法是:

CREATE EVENT `event_name`
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
DO BEGIN
-- event body
END;

时间表可分配的各种设置,如

运行一次在一个特定的日期/时间:
AT'YYYY - MM - DD HH:MM.SS
例如'2011 - 06 - 01 02:00.00“
运行一次后,一个特定的时期已经过去了:
CURRENT_TIMESTAMP的AT +区间N [小时|月|周|日|分钟]
例如,CURRENT_TIMESTAMP +区间1天
永远运行在特定的时间间隔:
每n小时|月份|周|日| MINUTE]
例如,每1天
在特定的时间间隔运行在一个特定的时期:
每n小时|月份|周|日| MINUTE]启动日结束日期
,如每1天开始CURRENT_TIMESTAMP +间隔1周结束2012 - 01 - 01 00:00.00 “
事件通常是下降,一旦其时间表已过期(于完成时不保留) 。完成PRESERVE,以防止这种行为 。MySQL创建事件的语法文件提供进一步的细节。

现在,我们可以定义我们的事件(记得先设置分隔符)。我们将它设置在一个星期天的早晨开始运行每周:

DELIMITER $$
CREATE
EVENT `archive_blogs`
ON SCHEDULE EVERY 1 WEEK STARTS '2011-07-24 03:00:00'
DO BEGIN
-- copy deleted posts
INSERT INTO blog_archive (id, title, content)
SELECT id, title, content
FROM blog
WHERE deleted = 1;
-- copy associated audit records
INSERT INTO audit_archive (id, blog_id, changetype, changetime)
SELECT audit.id, audit.blog_id, audit.changetype, audit.changetime
FROM audit
JOIN blog ON audit.blog_id = blog.id
WHERE blog.deleted = 1;
-- remove deleted blogs and audit entries
DELETE FROM blog WHERE deleted = 1;
END */$$
DELIMITER ;

这是一个简单的例子,但你可以添加更多的功能,例如只将被删除了至少1个月前的职位和清除阵列1岁以上的所有职位。我希望您喜欢这个系列,并且正在考虑在您的下一个项目的数据库触发器和事件。

推荐继续阅读的文章