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

标签 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 是插入的日期时间,enddate 通常是三天后。

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

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

他们建议:

You should be able to do it using a trigger and the event scheduler:

  • create a trigger on the table that is fired on every update / insert
  • this trigger creates a scheduled event that occurs at the datetime of the row and updates >your second table

我尝试创建这样的查询但没有成功。

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 - Recursion of EVENT DDL statements is forbidden when body is present

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

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

BR, 伊尔科

最佳答案

对不起,兄弟,但根据我一直在阅读的内容,您的建议是不可能的。我认为您不能使用触发器创建事件。真可惜,因为它对我也很有用。

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

<?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));
}

所以基本上是在您向表中添加战斗时创建事件。

关于mysql - 如何在过程或触发器中创建 mysql 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9841030/

相关文章:

php - 查询结果显示间距

button - 如何从 ui 操作触发 ServiceNow 工作流程?

javascript - 我可以通过从 PHP 获取变量来更改 Javascript 中的显示属性吗?

c# - 如何取消订阅 MvvmCross 中的 WeakSubscribe

javascript - 使用 e.target 后如何获得整个(父)元素而不仅仅是特定的子元素

Angular:event.srcElement 没有指向预期的元素

mysql - 为什么我不断收到 'Incorrect Syntax near ' Select'.期待 Set' 错误?

MySql 触发器问题变量未在命令字符串中引用

mysql - 从一个表复制到另一个表,如何对整个数据集而不是单独的行强制执行外键检查?

php - 如何将数组插入mysql数据库?