Как создать событие mysql внутри процедуры или триггера? - PullRequest
4 голосов
/ 23 марта 2012

недавно я искал решение для следующей ситуации:

У меня есть таблица 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 - это дата и время вставки, и обычно конец - через три дня.

Я хотел бы создать событие mysql, которое останавливает битву (устанавливает active = 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 ;

Ошибка, которую я получаю:

1576 - рекурсия утверждений DDL EVENT запрещена при наличии тела

Я пытался сРазличные разделители в каждой структуре строк также не имеют успеха.

Если кто-то может помочь, пожалуйста, сообщите.

BR, Ilko

1 Ответ

4 голосов
/ 21 декабря 2013

Извините, брат, но из того, что я читал, то, что вы предлагаете, невозможно.Я не думаю, что вы можете создать событие с помощью триггера.Который является обломом, потому что это было бы полезно и для меня.

Однако было бы легче создать событие, когда создается строка для каждого сражения.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));
}

Поэтому создайте событие, когда вы добавляете битву к таблице.

...