kac*_*har 5 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 ;
Run Code Online (Sandbox Code Playgroud)
每场战斗都有开始日期和结束日期。开始日期是插入的日期时间,通常结束日期是三天后。
我想创建一个 mysql 事件,在战斗结束日期停止战斗(设置活动 = 0)。我希望在战斗表中的插入触发器上创建此事件。
有一个相关问题的答案很少(这里)。
他们建议:
您应该能够使用触发器和事件调度程序来做到这一点:
- 在每次更新/插入时触发的表上创建一个触发器
- 此触发器创建在行的日期时间发生的计划事件并更新>您的第二个表
我试图创建这样一个查询,但没有成功。
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 ;
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
1576 - 当正文存在时禁止递归 EVENT DDL 语句
我已经尝试在 for each row 结构中使用不同的分隔符,但也没有成功。
如果有人可以提供帮助,请指教。
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));
}
Run Code Online (Sandbox Code Playgroud)
因此,基本上,当您将战斗添加到表中时,就会创建事件。
| 归档时间: |
|
| 查看次数: |
4158 次 |
| 最近记录: |