meteorlake
@meteorlake
Кодю код, админю домашний сервер с фильмами

Mysql, как выполнять события(events) только при условии?

Здравствуйте, пытаюсь создать события выполняемые раз в час, но запускать выполнение только при определённых условиях. Создал такое событие и оно работает, но показывает ошибку на последней строке и при экспорте всех событий последующий импорт не возможен из-за присутствия этих ошибок. Что я сделал не так?

CREATE DEFINER=`sql_test`@`%` EVENT `Маркировка` ON SCHEDULE EVERY 1 HOUR STARTS '2022-05-29 23:15:23' 
ON COMPLETION NOT PRESERVE ENABLE DO
  IF (SELECT `value` FROM `config` WHERE `name` = 'profile_deleting') = 'allowed' THEN 
    UPDATE `tasks` SET `status` = 4  WHERE `status` = 3;
  END IF;
  • Вопрос задан
  • 48 просмотров
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
Если просто переписать в соответствии с правильным синтаксисом, и при этом избавиться от ненужного IF, то
CREATE DEFINER=`sql_test`@`%` EVENT `Маркировка` 
ON SCHEDULE 
    EVERY 1 HOUR 
    STARTS '2022-05-29 23:15:23' 
-- ON COMPLETION NOT PRESERVE   -- не имеет смысла для периодической задачи
-- ENABLE                       -- по умолчанию эвент включен при создании
DO
UPDATE `tasks` 
SET `status` = 4  
WHERE `status` = 3
  AND EXISTS ( SELECT NULL  
               FROM `config` 
               WHERE `name` = 'profile_deleting'
                 AND `value` = 'allowed' );

Однако логика какая-то странная - обновляются все записи, и при этом проверяется наличие абы какой записи. Хотя разум требует наличия зависимости между обновляемой и проверяемой записями.

======

Впрочем, никто не запрещает сохранить исходный вид:
CREATE DEFINER=`sql_test`@`%` EVENT `Маркировка` 
ON SCHEDULE 
    EVERY 1 HOUR 
    STARTS '2022-05-29 23:15:23' 
-- ON COMPLETION NOT PRESERVE 
-- ENABLE 
DO
BEGIN
  IF (SELECT `value` FROM `config` WHERE `name` = 'profile_deleting') = 'allowed' THEN 
    UPDATE `tasks` SET `status` = 4  WHERE `status` = 3;
  END IF;
END;

Но:
  1. при создании такой процедуры придётся переопределять DELIMITER
  2. если подзапрос вернёт более одной записи - это приведёт к ошибке

Проблему с возвращающим более одной записи подзапросом можно поправить следующим изменением:
IF 'allowed' IN (SELECT `value` FROM `config` WHERE `name` = 'profile_deleting') THEN
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы