首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在过程或触发器中创建mysql事件?

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

Stack Overflow用户
提问于 2012-03-23 14:31:55
回答 1查看 4.8K关注 0票数 5

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

我有具有结构的mysql表:

代码语言:javascript
复制
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是插入的日期,通常结束日期是三天之后。

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

有一个相关的问题,很少有答案(here)。

他们建议:

您应该能够使用触发器和事件调度程序来完成这个任务:

  • 在每次更新/插入
  • 上触发的表上创建一个触发器--该触发器创建一个在该行日期时发生的预定事件,并更新>第二个表

我试图创建这样一个查询,但没有成功。

代码语言:javascript
复制
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语句的递归。

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

如果有人能帮忙,请告诉我。

布尔伊科

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-21 08:34:21

对不起,兄弟,从我一直读到的情况来看,你的建议是不可能的。我不认为你能用触发器创建一个事件。这是一个令人沮丧的事情,因为这对我也是有用的。

但是,在创建每一次战斗的行时,创建事件就更容易了。我从一个解释事件工作原理的人那里找到了一些代码的例子。

代码语言:javascript
复制
<?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));
}

所以,当你在桌子上加入一场战斗时,基本上要创建一个事件。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9841030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档