如何在过程或触发器中创建mysql事件?

时间:2012-03-23 14:31:56

标签: mysql events triggers delimiter

最近我一直在寻找以下情况的解决方案:

我有结构的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是插入的日期时间,通常是三天后的结束日期。

我想在战斗结束时创建一个停止战斗(设置active = 0)的mysql事件。我希望在战斗表中的插入触发器上创建此事件。

有一个相关问题,很少有答案(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 - 当身体存在时,禁止递送EVENT DDL语句

我已尝试在每个行结构中使用不同的分隔符,但也没有成功。

如果有人可以提供帮助,请告知。

BR, Ilko

1 个答案:

答案 0 :(得分: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));
}

所以基本上在向桌面添加战斗时创建事件。