CREATE
    [DEFINER = { user | CURRENT_USER }]
    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}
        このステートメントによって新しいイベントが作成され、スケジュールされます。このステートメントには、イベントが作成されるスキーマに対する
        EVENT
        権限が必要です。
      
        有効な CREATE
        EVENT
        ステートメントの最小要件は次のとおりです。
      
            キーワード CREATE
            EVENT、および現在のスキーマ内のイベントを一意に識別するイベント名。(MySQL
            5.1.12
            より前のバージョンでは、イベント名は、特定のデータベース上の同じユーザーによって作成されたイベント間でのみ一意である必要がありました。)
          
            イベントを実行する時期と頻度を決定する
            ON SCHEDULE 節。
          
            イベントによって実行される SQL
            ステートメントを含む
            DO 節。
          
        最小限の CREATE
        EVENT
        ステートメントの例を次に示します。
      
CREATE EVENT myevent
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
    DO
      UPDATE myschema.mytable SET mycol = mycol + 1;
        前のステートメントは、myevent
        という名前のイベントを作成します。このイベントは、myschema.mytable
        テーブルの mycol
        カラムの値を 1 増やす SQL
        ステートメントを実行することによって、作成の
        1 時間後に 1 回実行されます。
      
        event_name は、最大長が 64
        文字の有効な MySQL
        識別子である必要があります。名前は逆引用符を使用して区切ることができ、データベーススキーマの名前で修飾することもできます。イベントは
        MySQL ユーザー (定義者)
        とスキーマの両方に関連付けられており、その名前は、そのスキーマ内のイベントの名前の間で一意である必要があります。一般に、イベント名を管理する規則は、ストアドルーチンの名前の場合と同じです。項5.2. 「スキーマオブジェクト名」
        を参照してください。
      
        event_name
        の一部としてスキーマが示されていない場合は、デフォルトの
        (現在の) スキーマと見なされます。
      
          MySQL
          は、イベント名の一意性を確認するときに、大文字と小文字を区別しないで比較します。つまり、たとえば、同じデータベーススキーマ内の
          2 つのイベントの名前を
          myevent と
          MyEvent
          にすることはできません。
        
        DEFINER
        節は、イベント実行時にアクセス権限を確認するときに使用される
        MySQL
        アカウントを指定します。user
        値を附与する場合、それを「'フォーマット
        (user_name'@'host_name'GRANT
        ステートメントに使用したと同じフォーマット)
        の中にある MySQL
        アカウントとするべきです。user_name
        の値と host_name
        の値が両方共要求されます。また、定義子はCURRENT_USER
        あるいは
        CURRENT_USER()
        として指定することもできます。DEFINER
        のデフォルト値は、CREATE
        EVENT
        ステートメントを実行するユーザーです。(これは
        DEFINER = CURRENT_USER
        と同じです)。
      
        DEFINER
        節を指定する場合は、これらの規則によって正当な
        DEFINER
        ユーザー値が決定されます。
      
            SUPER
            権限を持たない場合、文字によるか、
            CURRENT_USER
            を使って規定された正当な
            user
            値だけがユーザーのアカウントになります。定義子をほかのアカウントに設定することはできません。
          
            SUPER
            権限を持っている場合、構文的に正当なアカウント名を指定することができます。そのアカウントが実在しない場合、警告が生成されます。
          
            存在しない DEFINER
            値を使用してイベントを作成できますが、そのイベントが定義者の権限で実行されたにもかかわらず、実行時にその定義者が存在しない場合はエラーが発生します。
          
        DEFINER 節は MySQL
        5.1.17.で追加されました。(MySQL 5.1.12
        より前のバージョンでは、2
        人の別のユーザーが、同じデータベーススキーマ上の同じ名前を持つ異なるイベントを作成することが可能でした。)
      
        イベント内では、CURRENT_USER()
        関数が、イベント実行時に権限を確認するために使用されるアカウント
        (DEFINER ユーザー)
        を返します。イベント内のユーザー監査については、Auditing MySQL Account Activity
        を参照してください。
      
        IF NOT EXISTS
        は、CREATE
        EVENT
        に対して、CREATE
        TABLE
        に対する場合と同じ意味を持ちます。event_name
        という名前のイベントが同じスキーマ内にすでに存在している場合、アクションは実行されず、エラーも発生しません。(ただし、その場合は警告が生成されます。)
      
        ON SCHEDULE
        節によって、イベントに対して定義された
        sql_statement
        を繰り返す時期、頻度、および期間が決定されます。この節は、次の
        2 つの形式のいずれかを取ります。
      
            1
            回限りのイベントには、AT
            
            が使用されます。これは、イベントが
            timestamptimestamp
            で指定された日付と時刻に 1
            回だけ実行されることを指定します。この値は、日付と時刻の両方を含んでいるか、または
            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
            を使用して、現在の日付と時刻を指定できます。このような場合、イベントは、作成されるとすぐに機能します。
          
            現在の日付と時刻に相対的な将来のある時点で発生するイベント
            (「今から 3
            週間後」というフレーズで表現されるイベントなど)
            を作成するには、オプションの節
            + INTERVAL
            
            を使用できます。intervalinterval
            部分は、数値と時間単位の 2
            つの部分で構成され、DATE_ADD()
            関数で使用される間隔を管理するのと同じ構文規則に従います
            (項7.6. 「日付時刻関数」
            を参照)。また、単位のキーワードも、イベントを定義する場合はマイクロ秒を含む単位を使用できない点を除いて同じです。一部の間隔型では、複合の時間単位を使用できます。
            たとえば、「2 分と 10 秒」を
            + INTERVAL '2:10'
            MINUTE_SECOND として表現できます。
          
            また、間隔を組み合わせることもできます。たとえば、AT
            CURRENT_TIMESTAMP + INTERVAL 3 WEEK + INTERVAL 2
            DAY は、「今から 3 週間と 2
            日」と同等です。このような節の各部分は、+
            INTERVAL で始まる必要があります。
          
            定期的な間隔でアクションを繰り返すには、EVERY
            節を使用します。EVERY
            キーワードのあとに、前の
            AT
            キーワードで説明した
            interval
            を指定します。(+
            INTERVAL が
            EVERY
            とともに使用されることはありません。)
            たとえば、EVERY 6
            WEEK は 「6
            週間ごと」を示します。
          
            EVERY 節で
            + INTERVAL
            節を使用することは許可されていませんが、+
            INTERVAL
            で許可された同じ複合の時間単位を使用できます。
          
            また、EVERY
            節に、オプションの
            STARTS
            節を含めることもできます。STARTS
            のあとに、アクションで繰り返しを開始する時期を示す
            timestamp
            値を指定します。また、「今からの」時間を指定するために
            + INTERVAL
            
            を使用することもできます。たとえば、intervalEVERY
            3 MONTH STARTS CURRENT_TIMESTAMP + INTERVAL 1 WEEK
            は、「今から 1 週間後に開始して 3
            か月ごと」を示します。同様に、「今から
            6 時間と 15 分後から開始して 2
            週ごと」を、EVERY 2 WEEK
            STARTS CURRENT_TIMESTAMP + INTERVAL '6:15'
            HOUR_MINUTE
            として表すことができます。STARTS
            を指定しないことは、STARTS
            CURRENT_TIMESTAMP
            を使用することと同じです。つまり、イベントに対して指定されたアクションは、イベントが作成されるとただちに繰り返しを開始します。
          
            また、EVERY
            節に、オプションの
            ENDS
            節を含めることもできます。ENDS
            キーワードのあとに、イベントで繰り返しを停止する時期を
            MySQL に指示する timestamp
            値を指定します。また、ENDS
            とともに + INTERVAL
            
            を使用することもできます。たとえば、intervalEVERY
            12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS
            CURRENT_TIMESTAMP + INTERVAL 4 WEEK
            は、「今から 30 分後に開始し、今から 4
            週間後に終了するまでの 12
            時間ごと」と同等です。ENDS
            を使用しないことは、イベントがいつまでも実行を続行することを示します。
          
            ENDS
            は、複合の時間単位に対して
            STARTS
            と同じ構文をサポートします。
          
            EVERY 節では
            STARTS または
            ENDS、あるいはその両方を使用できます。また、どちらも使用しないことも可能です。
          
              MySQL 5.1.17
              からは、INFORMATION_SCHEMA.EVENTS
              および mysql.event
              テーブルや、SHOW
              EVENTS
              の出力に示すように、STARTS
              または ENDS は
              MySQL
              サーバーの現地時間を使用します。以前は、この情報は
              UTC を使用して格納されていました (Bug#16420)。
            
              この変更のために、以前のリリースで作成されたイベントを
              MySQL 5.1.17
              以降で作成、変更、表示、または使用できるようにするには、その前に
              mysql.event
              テーブルを更新する必要があります。このために
              mysql_upgrade
              を使用できます (mysql_upgrade
              を参照)。
            
              これらの変更に対処するために MySQL 5.1.17
              で追加されたカラムについては、The INFORMATION_SCHEMA EVENTS Table
              および 項8.5.5.19. 「SHOW EVENTS 構文」
              を参照してください。
            
            繰り返しイベントがスケジュール間隔内に終了しない場合は、イベントの複数のインスタンスが同時に実行される可能性があります。これが好ましくない場合は、同時インスタンスを回避するためのメカニズムを設けてください。たとえば、GET_LOCK()
            関数、あるいは行またはテーブルのロックを使用できます。
          
        ON SCHEDULE 節では、MySQL
        組み込み関数を含む式や、その関数に含まれている任意の
        timestamp 値または
        interval
        値を取得するためのユーザー変数を使用できます。このような式でストアドファンクションやユーザー定義関数を使用したり、テーブル参照を使用したりすることはできません。ただし、SELECT
        FROM DUAL
        は使用できます。これは、CREATE
        EVENT ステートメントと
        ALTER EVENT
        ステートメントの両方に当てはまります。MySQL
        5.1.13
        からは、そのような場合のストアドファンクション、ユーザー定義関数、およびテーブルへの参照は明確に禁止され、エラーで失敗します
        (Bug#22830 を参照)。
      
        通常は、イベントの期限が切れると、そのイベントはただちに削除されます。この動作は、ON
        COMPLETION PRESERVE
        を指定することによってオーバーライドできます。ON
        COMPLETION NOT PRESERVE
        を使用すると、単にデフォルトの非持続性の動作が明示的になるだけです。
      
        DISABLE
        キーワードを使用すると、イベントを作成しても、そのイベントがアクティブにならないようにすることができます。または、ENABLE
        を使用して、デフォルトのステータス
        (アクティブ)
        を明示的にすることができます。これは、ALTER
        EVENT と組み合わせるともっとも有効です
        (項8.1.2. 「ALTER EVENT 構文」 を参照)。
      
        MySQL 5.1.18
        からは、ENABLED または
        DISABLED の代わりに 3
        番目の値が表示される可能性もあります。DISABLE
        ON SLAVE
        は、イベントがマスター上で作成され、スレーブに複製されたが、スレーブ上では実行されないことを示すためにレプリケーションスレーブ上のイベントのステータスとして設定されます。Replication of Invoked Features
        を参照してください。
      
        COMMENT
        節を使用して、イベントに対するコメントを指定できます。comment
        には、イベントの説明に使用する、最大 64
        文字の任意の文字列を指定できます。コメントテキストは文字列リテラルであるため、引用符で囲む必要があります。
      
        DO
        節は、イベントによって実行されるアクションを指定するものであり、SQL
        ステートメントで構成されます。ストアドルーチンで使用できる有効な
        MySQL
        ステートメントのほぼすべてが、スケジュールされたイベントのアクションステートメントとしても使用できます。詳細は、Restrictions on Stored Routines, Triggers, and Events
        を参照してください。たとえば、次のイベント
        e_hourly は 1 時間に 1
        回、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
        モードには関係なく、常にこの設定を適用してイベントを実行します。
      
        DO 節に
        ALTER EVENT
        ステートメントを含む
        CREATE EVENT
        ステートメントは、成功するように見えます。ただし、結果として得られるスケジュールされたイベントをサーバーが実行しようとすると、その実行はエラーで失敗します。
      
          SELECT や
          SHOW
          などの、単に結果セットを返すステートメントは、イベントで使用されても何も影響がありません。これらのステートメントからの出力は
          MySQL
          モニターには送信されず、どこにも格納されません。ただし、結果を格納する
          SELECT ... INTO や
          INSERT
          INTO ... SELECT
          などのステートメントは使用できます。(後者については、この節の次の例を参照。)
        
        イベントが属するスキーマは、DO
        節内のテーブル参照のためのデフォルトスキーマです。ほかのスキーマ内のテーブルへの参照はすべて、正しいスキーマ名で修飾する必要があります。(MySQL
        5.1.6 では、イベントの
        DO
        節で参照されるすべてのテーブルにスキーマへの参照を含める必要がありました。)
      
        次に示すように、ストアドルーチンと同様に、BEGIN
        および END
        キーワードを使用して
        DO
        節で複合ステートメントの構文を使用できます。
      
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
        コマンドの使用に注意してください。Defining Stored Programs
        を参照してください。
      
イベントでは、ストアドルーチンで使用されているような、より複雑な複合ステートメントを使用できます。この例では、ローカル変数、エラーハンドラ、およびフロー制御構造構文を使用しています。
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);
        さらに、イベントの定義者が
        SUPER
        権限を持っている場合は、イベントでグローバル変数を読み書きできます。この権限を与えると悪用される可能性があるため、これを行う場合は十分に注意する必要があります。
      
一般に、ストアドルーチンで有効なステートメントはすべて、イベントによって実行されるアクションステートメントにも使用できます。ストアドルーチン内で許可されるステートメントの詳細については、Stored Routine Syntax を参照してください。ストアドルーチンの一部としてイベントを作成できますが、イベントを別のイベントで作成することはできません。

