如何在程序或触发器中创建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)); 
} 

因此,基本上创建事件时,你添加一场战斗的表。

+0

我会为你定制代码,但是因为你问了这个问题已经过了一年了,我想它可能不再和你有关,但给了我们自己寻找答案的其他人的答案这个问题。特别是因为我只是通过比我想要的更多的研究找到答案。希望这会让别人的生活变得更简单。 – DcHerrera 2013-12-21 09:04:36

+0

是的,它相当古老,但你发布的方法是我曾用过的那个:)无论如何感谢您的答案:) – kachar 2013-12-21 15:51:38