如何在程序或触发器中创建mysql事件?
问题描述:
最近我一直在寻找一个解决以下情况:如何在程序或触发器中创建mysql事件?
我有mysql表结构:
CREATE TABLE IF NOT EXISTS `battles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`active` tinyint(1) NOT NULL,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
`begindate` datetime NOT NULL,
`enddate` datetime NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
每场战斗都有BEGINDATE日期和结束日期。 Begindate是插入的日期时间,通常enddate是三天后。
我想创建一个mysql事件,在战斗结束时停止战斗(设置活动= 0)。我希望在战斗表中的插入触发器上创建此事件。
很少有答案存在相关问题(here)。
他们建议:
您应该能够使用触发器和事件调度做到这一点:
- 创建是在每次更新运行的表的触发器/插入
- 此触发器会创建一个计划事件,该事件发生在该行的日期时间并更新>您的第二个表格
我试图创建这样一个查询,但没有成功。
DELIMITER |
DROP TRIGGER IF EXISTS battle_create_end|
CREATE TRIGGER battle_create_end AFTER INSERT ON battles
FOR EACH ROW BEGIN
CREATE EVENT IF NOT EXISTS CONCAT('battle_end_',NEW.id)
ON SCHEDULE AT NEW.enddate
DO
UPDATE battles SET battles.active = 0 WHERE battles.id = NEW.id;
END|
DELIMITER ;
我得到的错误是
1576 - 事件DDL语句的递归当身体出现
我在不同的分隔符试图禁止在每一行结构也没有成功。
如果有人可以帮忙,请指教。
BR, Ilko
答
对不起弟弟但是从我一直在读你提出什么是不可能的。我不认为你可以用触发器创建一个事件。这是一个无赖,因为它也会对我有用。
然而,在创建每次战斗的行时创建事件会更容易。听到的是我从一个人解释事件如何工作的一些代码示例。
<?php
// establish database connection and filter incoming data
// ...
// insert blog post with pending status, get id assigned to post
$query = "INSERT INTO blog_posts (id, title, post_text, status)
VALUES (NULL, :title, :postText, 'pending')";
$stm = $db->prepare($query);
$stm->execute(array(":title" => $title, ":postText" => $text));
$id = $db->lastInsertId();
// is this a future post?
if (isset($_POST["schedule"], $_POST["time"])) {
$scheduleDate = strtotime($_POST["time"]);
$query = "CREATE EVENT publish_:id
ON SCHEDULE AT FROM_UNIXTIME(:scheduleDate)
DO
BEGIN
UPDATE blog_posts SET status = 'published' WHERE id = :id;
END";
$stm = $db->prepare($query);
$stm->execute(array(":id" => $id, ":scheduleDate" => $scheduleDate));
}
// this is not a future post, publish now
else {
$query = "UPDATE blog_posts SET status = 'published' WHERE id = :id";
$stm = $db->prepare($query);
$stm->execute(array(":id" => $id));
}
因此,基本上创建事件时,你添加一场战斗的表。
我会为你定制代码,但是因为你问了这个问题已经过了一年了,我想它可能不再和你有关,但给了我们自己寻找答案的其他人的答案这个问题。特别是因为我只是通过比我想要的更多的研究找到答案。希望这会让别人的生活变得更简单。 – DcHerrera 2013-12-21 09:04:36
是的,它相当古老,但你发布的方法是我曾用过的那个:)无论如何感谢您的答案:) – kachar 2013-12-21 15:51:38