如何在存储过程或触发器中创建MySQL事件?

5
最近我一直在寻找以下情况的解决方案:
我有一个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 ;

每场战斗都有开始日期和结束日期。开始日期是插入的日期时间,通常结束日期是三天后。
我想创建一个mysql事件,在战斗结束日期停止战斗(设置活动状态为0)。我希望这个事件在battles表中的插入触发器上创建。
有一个相关问题,答案很少(这里)。
他们建议:
您应该能够使用触发器和事件调度程序来完成此操作:
创建一个在每次更新/插入时触发的表触发器
此触发器创建一个在行日期时间发生的计划事件,并更新第二个表格
我已经尝试创建这样的查询,但没有成功。
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 - 当存在主体时,禁止递归EVENT DDL语句

我尝试使用不同的分隔符在for each row结构中,但都没有成功。

如果有人能帮忙,请指导。

敬礼, Ilko

1个回答

4

很抱歉,根据我所阅读的内容,您提出的建议不可行。我认为您无法创建具有触发器的事件。这很令人失望,因为这对我也很有用。

然而,当每个战斗的行被创建时,创建事件会更容易。这里是我从一个解释事件如何工作的人那里找到的一些代码示例。

<?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
是的,这个方法很老了,但你发布的方法就是我以前用过的 :) 无论如何,谢谢你的回答 :) - kachar

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