Если просто переписать в соответствии с правильным синтаксисом, и при этом избавиться от ненужного
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;
Но:
- при создании такой процедуры придётся переопределять DELIMITER
- если подзапрос вернёт более одной записи - это приведёт к ошибке
Проблему с возвращающим более одной записи подзапросом можно поправить следующим изменением:
IF 'allowed' IN (SELECT `value` FROM `config` WHERE `name` = 'profile_deleting') THEN