CREATE [DEFINER = {user
| CURRENT_USER }] EVENT [IF NOT EXISTS]event_name
ON SCHEDULEschedule
[ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'comment
'] DOsql_statement
;schedule
: ATtimestamp
[+ INTERVALinterval
] ... | EVERYinterval
[STARTStimestamp
[+ INTERVAL interval] ...] [ENDStimestamp
[+ 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
が使用されます。これは、イベントが
timestamp
timestamp
で指定された日付と時刻に 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
を使用できます。interval
interval
部分は、数値と時間単位の 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
を使用することもできます。たとえば、interval
EVERY
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
を使用することもできます。たとえば、interval
EVERY
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 を参照してください。ストアドルーチンの一部としてイベントを作成できますが、イベントを別のイベントで作成することはできません。