Syntax
------

CREATE [OR REPLACE]
  [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]
  EVENT
  [IF NOT EXISTS]
  event_name
  ON SCHEDULE schedule
  [ON COMPLETION [NOT] PRESERVE]
  [ENABLE | DISABLE | DISABLE ON SLAVE]
  [COMMENT 'comment']
  DO sql_statement;

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}

Description
-----------

This statement creates and schedules a new event. It requires the EVENT
privilege for the schema in which the event is to be created.

The minimum requirements for a valid CREATE EVENT statement are as follows:

* The keywords CREATE EVENT plus an event name, which uniquely identifies
 the event in the current schema. (Prior to MySQL 5.1.12, the event name
 needed to be unique only among events created by the same user on a given
 database.)
* An ON SCHEDULE clause, which determines when and how often the event
 executes.
* A DO clause, which contains the SQL statement to be executed by an
 event.

Here is an example of a minimal CREATE EVENT statement:

CREATE EVENT myevent
  ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
  DO
   UPDATE myschema.mytable SET mycol = mycol + 1;

The previous statement creates an event named myevent. This event executes
once — one hour following its creation — by running an SQL statement that
increments the value of the myschema.mytable table's mycol column by 1.

The event_name must be a valid MariaDB identifier with a maximum length of 64
characters. It may be delimited using back ticks, and may be qualified with
the name of a database schema. An event is associated with both a MariaDB user
(the definer) and a schema, and its name must be unique among names of events
within that schema. In general, the rules governing event names are the same
as those for names of stored routines. See Identifier Names.

If no schema is indicated as part of event_name, the default (current) schema
is assumed.

For valid identifiers to use as event names, see Identifier Names.

OR REPLACE
----------

The OR REPLACE clause was included in MariaDB 10.1.4. If used and the event
already exists, instead of an error being returned, the existing event will be
dropped and replaced by the newly defined event.

IF NOT EXISTS
-------------

If the IF NOT EXISTS clause is used, MariaDB will return a warning instead of
an error if the event already exists. Cannot be used together with OR REPLACE.

ON SCHEDULE
-----------

The ON SCHEDULE clause can be used to specify when the event must be triggered.

AT
--

If you want to execute the event only once (one time event), you can use the
AT keyword, followed by a timestamp. If you use CURRENT_TIMESTAMP, the event
acts as soon as it is created. As a convenience, you can add one or more
intervals to that timestamp. You can also specify a timestamp in the past, so
that the event is stored but not triggered, until you modify it via ALTER
EVENT.

The following example shows how to create an event that will be triggered
tomorrow at a certain time:

CREATE EVENT example
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY + INTERVAL 3 HOUR
DO something;

You can also specify that an event must be triggered at a regular interval
(recurring event). In such cases, use the EVERY clause followed by the
interval.

If an event is recurring, you can specify when the first execution must happen
via the STARTS clause and a maximum time for the last execution via the ENDS
clause. STARTS and ENDS clauses are followed by a timestamp and, optionally,
one or more intervals. The ENDS clause can specify a timestamp in the past, so
that the event is stored but not executed until you modify it via ALTER EVENT.

In the following example, next month a recurring event will be triggered
hourly for a week:

CREATE EVENT example
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH + INTERVAL 1 WEEK
DO some_task;

Intervals consist of a quantity and a time unit. The time units are the same
used for other staments and time functions, except that you can't use
microseconds for events. For simple time units, like HOUR or MINUTE, the
quantity is an integer number, for example '10 MINUTE'. For composite time
units, like HOUR_MINUTE or HOUR_SECOND, the quantity must be a string with all
involved simple values and their separators, for example '2:30' or '2:30:30'.

ON COMPLETION [NOT] PRESERVE
----------------------------

The ON COMPLETION clause can be used to specify if the event must be deleted
after its last execution (that is, after its AT or ENDS timestamp is past). By
default, events are dropped when they are expired. To explicitly state that
this is the desired behaviour, you can use ON COMPLETION NOT PRESERVE.
Instead, if you want the event to be preserved, you can use ON COMPLETION
PRESERVE.

In you specify ON COMPLETION NOT PRESERVE, and you specify a timestamp in the
past for AT or ENDS clause, the event will be immediatly dropped. In such
cases, you will get a Note 1558: "Event execution time is in the past and ON
COMPLETION NOT PRESERVE is set. The event was dropped immediately after
creation".

ENABLE/DISABLE/DISABLE ON SLAVE
-------------------------------

Events are ENABLEd by default. If you want to stop MariaDB from executing an
event, you may specify DISABLE. When it is ready to be activated, you may
enable it using ALTER EVENT. Another option is DISABLE ON SLAVE, which
indicates that an event was created on a master and has been replicated to the
slave, which is prevented from executing the event. If DISABLE ON SLAVE is
specifically set, the event will be disabled everywhere. It will not be
executed on the mater or the slaves.

COMMENT
-------

The COMMENT clause may be used to set a comment for the event. Maximum length
for comments is 64 characters. The comment is a string, so it must be quoted.
To see events comments, you can query the INFORMATION_SCHEMA.EVENTS table (the
column is named EVENT_COMMENT).

Examples
--------

Minimal CREATE EVENT statement:

CREATE EVENT myevent
  ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
  DO
   UPDATE myschema.mytable SET mycol = mycol + 1;

An event that will be triggered tomorrow at a certain time:

CREATE EVENT example
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY + INTERVAL 3 HOUR
DO something;

Next month a recurring event will be triggered hourly for a week:

CREATE EVENT example
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH + INTERVAL 1 WEEK
DO some_task;

OR REPLACE and IF NOT EXISTS:

CREATE EVENT myevent
  ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
  DO
   UPDATE myschema.mytable SET mycol = mycol + 1;
ERROR 1537 (HY000): Event 'myevent' already exists

CREATE OR REPLACE EVENT myevent
  ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
  DO
   UPDATE myschema.mytable SET mycol = mycol + 1;;
Query OK, 0 rows affected (0.00 sec)

CREATE EVENT IF NOT EXISTS myevent
  ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
  DO
   UPDATE myschema.mytable SET mycol = mycol + 1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

SHOW WARNINGS;
+-------+------+--------------------------------+
| Level | Code | Message                        |
+-------+------+--------------------------------+
| Note  | 1537 | Event 'myevent' already exists |
+-------+------+--------------------------------+

URL: https://mariadb.com/kb/en/create-event/