13.1.12 Заявление CREATE EVENT
CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
DO event_body;
schedule: {
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
}
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
Это утверждение создает и планирует новое событие. Событие не выполняется, если планировщик событий не включён. Для получения информации о проверке состояния планировщика событий и его включении при необходимости, см. Раздел 23.4.2, «Настройка планировщика событий».
CREATE EVENT требует привилегии EVENT для схемы, в которой должно быть создано событие. Если присутствует фраза DEFINER, требуемые привилегии зависят от значения user, как обсуждается в Разделе 23.6, «Управление доступом к хранимым объектам».
Минимальные требования к валидному заявлению CREATE
EVENT следующие:
Ключевые слова
CREATE EVENTплюс имя события, которое однозначно идентифицирует событие в схеме базы данных.Фраза
ON SCHEDULE, которая определяет, когда и как часто выполняется событие.Фраза
DO, которая содержит SQL-заявление, которое должно быть выполнено событием.
Вот пример минимального заявления CREATE
EVENT:
CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
UPDATE myschema.mytable SET mycol = mycol + 1;
Предыдущее заявление создаёт событие под названием myevent. Это событие выполняется один раз — через один час после своего создания — выполняя SQL-заявление, которое увеличивает значение столбца mycol таблицы myschema.mytable на 1.
event_name должно быть допустимым идентификатором MySQL с максимальной длиной 64 символа. Имена событий не чувствительны к регистру, поэтому вы не можете иметь два события с именами myevent и MyEvent в одной и той же схеме. В общем случае правила, регулирующие имена событий, такие же, как и для имён хранимых процедур. См. Раздел 9.2, «Имена объектов схемы».
Событие связано со схемой. Если схема не указана в качестве части event_name, предполагается использовать схему по умолчанию (текущую). Чтобы создать событие в определённой схеме, квалифицируйте имя события с помощью схемы, используя синтаксис . schema_name.event_name
Фраза DEFINER указывает учётную запись MySQL, которая используется при проверке привилегий во время выполнения события. Если присутствует фраза DEFINER, значение user должно быть учётной записью MySQL, указанной как ', user_name'@'host_name'CURRENT_USER или CURRENT_USER(). Разрешенные значения user зависят от имеющихся у вас привилегий, как обсуждалось в Разделе 23.6, «Управление доступом к хранимым объектам». Также см. этот раздел для дополнительной информации о безопасности событий.
Если фраза DEFINER опущена, дефолтный определяющий элемент — пользователь, который выполняет утверждение CREATE
EVENT. Это эквивалентно явному указанию DEFINER = CURRENT_USER.
В теле события функция CURRENT_USER возвращает учётную запись, используемую для проверки привилегий во время выполнения события, которая является пользователем DEFINER. Для получения информации об аудировании пользователей в событиях, см. Раздел 6.2.18, «Аудит активности учётных записей на основе SQL».
IF NOT EXISTS имеет то же значение для CREATE EVENT, что и для CREATE TABLE: Если событие с именем event_name уже существует в той же схеме, никаких действий не выполняется, и ошибка не возникает. (Однако в таких случаях генерируется предупреждение.)
Фраза ON SCHEDULE определяет, когда, как часто и как долго повторяется действие event_body, определённое для события. Эта фраза имеет одну из двух форм:
-
ATиспользуется для однократного события. Она указывает, что событие выполняется только один раз в дату и время, заданныеtimestamptimestamp, которое должно включать и дату, и время, или должно быть выражением, разрешающимся до значения типа datetime. Для этой цели можно использовать значение типаDATETIMEилиTIMESTAMP. Если дата относится к прошлому, появляется предупреждение, как показано здесь:mysql>
SELECT NOW();+---------------------+ | NOW() | +---------------------+ | 2006-02-10 23:59:01 | +---------------------+ 1 row in set (0.04 sec) mysql>CREATE EVENT e_totals->ON SCHEDULE AT '2006-02-10 23:59:00'->DO INSERT INTO test.totals VALUES (NOW());Query OK, 0 rows affected, 1 warning (0.00 sec) mysql>SHOW WARNINGS\G*************************** 1. row *************************** Level: Note Code: 1588 Message: Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation.Заявления
CREATE EVENT, которые сами по себе некорректны (по любой причине), завершаются ошибкой.Можно использовать
CURRENT_TIMESTAMPдля указания текущей даты и времени. В таком случае событие выполняется сразу же после создания.Чтобы создать событие, которое произойдёт в какой-то момент в будущем относительно текущей даты и времени, например, то, что выражается фразой «через три недели», можно использовать необязательную фразу
+ INTERVAL. Частьintervalintervalсостоит из двух частей: количество и единица времени, и следует правилам синтаксиса, описанным в Временных интервалах, за исключением того, что вы не можете использовать никакие ключевые слова единиц, включающие микросекунды, при определении события. С некоторыми типами интервалов могут использоваться сложные единицы времени. Например, «через две минуты и десять секунд» можно выразить как+ INTERVAL '2:10' MINUTE_SECOND.Также можно комбинировать интервалы. Например,
AT CURRENT_TIMESTAMP + INTERVAL 3 WEEK + INTERVAL 2 DAYэквивалентно «через три недели и два дня». Каждая часть такой фразы должна начинаться с+ INTERVAL. -
Чтобы повторять действия через регулярные промежутки времени, используйте фразу
EVERY. Ключевое словоEVERYследует заinterval, как описано в предыдущем обсуждении ключевого словаAT. (+ INTERVALне используется сEVERY.) Например,EVERY 6 WEEKозначает «каждые шесть недель».Хотя фразы
+ INTERVALне допускаются в фразеEVERY, вы можете использовать те же сложные единицы времени, которые допускаются в+ INTERVAL.Фраза
EVERYможет содержать необязательную фразуSTARTS.STARTSследует за значениемtimestamp, которое указывает, когда действие должно начать повторяться, и также может использовать+ INTERVALдля указания количества времени «с этого момента». Например,intervalEVERY 3 MONTH STARTS CURRENT_TIMESTAMP + INTERVAL 1 WEEKозначает «каждые три месяца, начиная с одной недели от сейчас». Аналогично, вы можете выразить «каждые две недели, начиная с шести часов и пятнадцати минут от сейчас» какEVERY 2 WEEK STARTS CURRENT_TIMESTAMP + INTERVAL '6:15' HOUR_MINUTE. ОтсутствиеSTARTSэквивалентно использованиюSTARTS CURRENT_TIMESTAMP— то есть действие, указанное для события, начинает повторяться сразу после создания события.Фраза
EVERYможет содержать необязательную фразуENDS. Ключевое словоENDSследует за значениемtimestamp, которое указывает MySQL, когда событие должно прекратить повторяться. Также можно использовать+ INTERVALсintervalENDS; например,EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEKэквивалентно «каждые двенадцать часов, начиная с тридцати минут от сейчас и заканчивая через четыре недели». ОтсутствиеENDSозначает, что событие продолжает выполняться неопределённо.ENDSподдерживает тот же синтаксис для сложных единиц времени, что иSTARTS.Вы можете использовать
STARTS,ENDS, оба или ни то, ни другое во фразеEVERY.Если повторяющееся событие не завершается в течение своего интервала планирования, результат может состоять из нескольких экземпляров события, выполняемых одновременно. Если это нежелательно, вы должны установить механизм для предотвращения одновременного выполнения. Например, вы можете использовать функцию
GET_LOCK()или блокировку строк или таблиц.
Фраза ON SCHEDULE может использовать выражения, включающие встроенные функции MySQL и переменные пользователей, для получения любых значений timestamp или interval, которые она содержит. Вы не можете использовать хранимые функции или загружаемые функции в таких выражениях, а также любые ссылки на таблицы; однако вы можете использовать SELECT FROM DUAL. Это верно как для утверждений CREATE EVENT, так и для утверждений ALTER EVENT. Ссылки на хранимые функции, загружаемые функции и таблицы в таких случаях запрещены и приводят к ошибке (см. ошибку #22830).
Временные значения в клаузе ON SCHEDULE интерпретируются с использованием текущего значения переменной сессии time_zone. Это становится часовым поясом события; то есть, часовой пояс, используемый для планирования событий и действующий во время выполнения события. Эти значения времени преобразуются в UTC и хранятся вместе с часовым поясом события в таблице mysql.event. Это позволяет выполнять события в соответствии с заданными параметрами независимо от последующих изменений часового пояса сервера или эффектов перехода на летнее время. Дополнительную информацию о представлении временных значений событий см. в разделе 23.4.4 «Данные о событиях». Также см. раздел 13.7.5.18 «Команда SHOW EVENTS» и раздел 24.3.8 «Таблица INFORMATION_SCHEMA EVENTS».
Обычно, после истечения срока действия события, оно немедленно удаляется. Вы можете изменить это поведение, указав ON
COMPLETION PRESERVE. Использование ON COMPLETION NOT
PRESERVE просто делает явным поведение по умолчанию — непродолжительность.
Вы можете создать событие, но предотвратить его активацию, используя ключевое слово DISABLE. В качестве альтернативы, вы можете использовать ENABLE, чтобы явно указать состояние по умолчанию, которое является активным. Это наиболее полезно в сочетании с ALTER EVENT (см. раздел 13.1.2 «Команда ALTER EVENT»).
Третье значение может также появиться вместо ENABLE или DISABLE; DISABLE ON SLAVE устанавливается для статуса события на реплике, чтобы указать, что событие было создано на источнике и реплицировано на реплику, но не выполняется на реплике. См. раздел 16.4.1.16 «Репликация вызываемых функций».
Вы можете указать комментарий к событию, используя клаузу COMMENT. comment может быть любой строкой длиной до 64 символов, которую вы хотите использовать для описания события. Текст комментария, являясь строковой литеральной величиной, должен быть заключён в кавычки.
Клауза DO определяет действие, выполняемое событием, и состоит из оператора SQL. Почти любой допустимый оператор MySQL, который может быть использован в хранимой процедуре, также может быть использован в качестве оператора действия для запланированного события. (См. раздел 23.8 «Ограничения для хранимых программ».) Например, следующее событие e_hourly удаляет все строки из таблицы sessions один раз в час, где эта таблица является частью схемы site_activity:
CREATE EVENT e_hourly
ON SCHEDULE
EVERY 1 HOUR
COMMENT 'Clears out sessions table each hour.'
DO
DELETE FROM site_activity.sessions;
MySQL сохраняет значение переменной системы sql_mode, действующее в момент создания или изменения события, и всегда выполняет событие с этим значением, независимо от текущего режима SQL сервера во время начала выполнения события.
Оператор CREATE EVENT, содержащий оператор ALTER EVENT в клаузе DO, кажется успешным; однако, когда сервер пытается выполнить получившееся запланированное событие, выполнение завершается с ошибкой.
Операторы, такие как SELECT или SHOW, которые просто возвращают набор результатов, не имеют эффекта при использовании в событиях; вывод от них не отправляется в монитор MySQL и не сохраняется нигде. Однако вы можете использовать операторы, такие как SELECT ...
INTO и INSERT INTO ...
SELECT, которые сохраняют результат. (См. следующий пример в этом разделе для примера последнего.)
Схема, к которой принадлежит событие, является схемой по умолчанию для ссылок на таблицы в клаузе DO. Любые ссылки на таблицы в других схемах должны быть квалифицированы соответствующим именем схемы.
Как и в случае с хранимыми процедурами, вы можете использовать синтаксис составных операторов в клаузе DO, используя ключевые слова BEGIN и END, как показано здесь:
delimiter |
CREATE EVENT e_daily
ON SCHEDULE
EVERY 1 DAY
COMMENT 'Saves total number of sessions then clears the table each day'
DO
BEGIN
INSERT INTO site_activity.totals (time, total)
SELECT CURRENT_TIMESTAMP, COUNT(*)
FROM site_activity.sessions;
DELETE FROM site_activity.sessions;
END |
delimiter ;
В этом примере используется команда delimiter для изменения разделителя операторов. См. раздел 23.1 «Определение хранимых программ».
Более сложные составные операторы, такие как те, которые используются в хранимых процедурах, возможны в событии. В этом примере используются локальные переменные, обработчик ошибок и конструкция управления потоком:
delimiter |
CREATE EVENT e
ON SCHEDULE
EVERY 5 SECOND
DO
BEGIN
DECLARE v INTEGER;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
SET v = 0;
WHILE v < 5 DO
INSERT INTO t1 VALUES (0);
UPDATE t2 SET s1 = s1 + 1;
SET v = v + 1;
END WHILE;
END |
delimiter ;
Нет способа напрямую передавать параметры в события или из них; однако возможно вызвать хранимую процедуру с параметрами внутри события:
CREATE EVENT e_call_myproc
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
DO CALL myproc(5, 27);
Если у определяющего событие пользователя есть права на установку глобальных переменных системы (см. раздел 5.1.8.1 «Права на переменные системы»), то событие может считывать и записывать глобальные переменные. Поскольку предоставление таких привилегий подразумевает потенциальную возможность злоупотребления, необходимо проявлять крайнюю осторожность при их предоставлении.
Как правило, любые операторы, допустимые в хранимых процедурах, могут использоваться в операторах действия, выполняемых событиями. Дополнительную информацию об операторах, разрешённых в хранимых процедурах, см. в разделе 23.2.1 «Синтаксис хранимых процедур». Вы можете создать событие как часть хранимой процедуры, но событие не может быть создано другим событием.
© 2025 Oracle
Licensed under the GPLv2 License.