MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLイベント作成時にON COMPLETION PRESERVE句を使うとどうなる?実例で解説

MySQLのイベントは、スケジュールされた実行時刻が過ぎて期限切れになると、デフォルトでは自動的に削除されます。そのため、SHOW EVENTSステートメントを実行しても、そのイベントを確認することはできません。

このようなデフォルトの動作を変更したい場合は、イベント作成時にON COMPLETION PRESERVE句を指定します。この句を使用すると、イベントが完了した後もデータベース内に保持され、SHOW EVENTSの結果として確認できるようになります。以下の具体例でその違いを見ていきましょう。

準備:サンプルテーブルの作成

まず、イベントの実行結果を記録するためのテーブルを作成します。

mysql> Create table event_messages(ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, MESSAGE VARCHAR(255) NOT NULL, Generated_at DATETIME NOT NULL);
Query OK, 0 rows affected (0.61 sec)

ON COMPLETION PRESERVEなしでイベントを作成した場合

次のクエリでは、ON COMPLETION PRESERVEを指定せずにイベントを作成しています。この場合、イベントは実行後に自動的に削除されるため、SHOW EVENTS FROM db_nameの結果には表示されません。

mysql> CREATE EVENT testing_event_without_Preserves ON SCHEDULE AT CURRENT_TIMESTAMP DO INSERT INTO event_messages(message,generated_at) Values('Without Preserve',NOW());
Query OK, 0 rows affected (0.00 sec)

mysql> Select * from event_messages;
+----+------------------+---------------------+
| ID | MESSAGE          | Generated_at        |
+----+------------------+---------------------+
| 1  | Without Preserve | 2017-11-22 20:32:13 |
+----+------------------+---------------------+
1 row in set (0.00 sec)

mysql> SHOW EVENTS FROM query\G
*************************** 1. row ***************************
                  Db: query
                Name: testing_event5
             Definer: root@localhost
           Time zone: SYSTEM
                Type: ONE TIME
          Execute at: 2017-11-22 17:09:11
      Interval value: NULL
      Interval field: NULL
              Starts: NULL
                Ends: NULL
              Status: DISABLED
          Originator: 0
character_set_client: cp850
collation_connection: cp850_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)

テーブルへのINSERTは正常に実行されていますが、SHOW EVENTSの出力を見ると、作成した「testing_event_without_Preserves」は一覧に存在しません。これは、イベントが完了と同時に自動削除されたことを示しています。

ON COMPLETION PRESERVEありでイベントを作成した場合

続いて、ON COMPLETION PRESERVE句を付けてイベントを作成してみます。この場合、イベントは実行後も削除されず、SHOW EVENTS FROM db_nameの結果に表示され続けます。

mysql> CREATE EVENT testing_event_with_Preserves ON SCHEDULE AT CURRENT_TIMESTAMP ON COMPLETION PRESERVE DO INSERT INTO event_messages(message,generated_at) Values('With Preserve',NOW());
Query OK, 0 rows affected (0.00 sec)

mysql> Select * from event_messages;
+----+------------------+---------------------+
| ID | MESSAGE          | Generated_at        |
+----+------------------+---------------------+
| 1  | Without Preserve | 2017-11-22 20:32:13 |
| 2  | With Preserve    | 2017-11-22 20:35:12 |
+----+------------------+---------------------+
2 rows in set (0.00 sec)

mysql> SHOW EVENTS FROM query\G
*************************** 1. row ***************************
                  Db: query
                Name: testing_event5
             Definer: root@localhost
           Time zone: SYSTEM
                Type: ONE TIME
          Execute at: 2017-11-22 17:09:11
      Interval value: NULL
      Interval field: NULL
              Starts: NULL
                Ends: NULL
              Status: DISABLED
          Originator: 0
character_set_client: cp850
collation_connection: cp850_general_ci
  Database Collation: latin1_swedish_ci
*************************** 2. row ***************************
                  Db: query
                Name: testing_event_with_Preserves
             Definer: root@localhost
           Time zone: SYSTEM
                Type: ONE TIME
          Execute at: 2017-11-22 20:35:12
      Interval value: NULL
      Interval field: NULL
              Starts: NULL
                Ends: NULL
              Status: DISABLED
          Originator: 0
character_set_client: cp850
collation_connection: cp850_general_ci
  Database Collation: latin1_swedish_ci
2 rows in set (0.00 sec)

出力結果の2行目に「testing_event_with_Preserves」が表示されているのが確認できます。このようにON COMPLETION PRESERVE句を指定することで、完了済みのイベントもデータベース上に残り、後から内容や定義を確認できるようになります。

まとめ

  • デフォルト設定では、MySQLイベントは完了(期限切れ)すると自動的に削除されます。
  • ON COMPLETION PRESERVE句を指定して作成したイベントは、完了後も削除されず、SHOW EVENTSで確認できます。
  • イベントの実行履歴や定義を後から参照したい場合は、この句の活用が有効です。
  1. MySQLで予約語「Key」をカラム名として使用する方法【バッククォートの使い方】

    MySQLでは「Key」は予約語(予約済みキーワード)として登録されているため、そのままカラム名として使用するとエラーが発生します。そこで活躍するのがバッククォート(`)です。カラム名の前後をバッククォートで囲むことで、予約語でも安全に使用できるようになります。本記事では、実際にカラム名「key」を持つテーブルを作成する例を通じて、具体的な手順をわかりやすく解説します。1. テーブルを作成するまず、バッククォートで囲んだ「Key」というカラムを持つテーブルを作成しましょう。mysql> create table DemoTable ( `Key` int ); Query OK,

  2. Java 9のmodule-info.javaでrequires句を使う方法を徹底解説

    Java 9のモジュールとはモジュールはJava 9で導入された重要な概念です。この概念を活用することで、コードを「モジュール」と呼ばれる小さなコンポーネントへ分割できます。各モジュールはそれぞれ独自の責務を持ち、正しく動作するために必要な他のモジュールへの依存関係を明示的に宣言します。モジュールを宣言するには、ソースコードのルートディレクトリに「module-info.java」ファイルを配置する必要があります。requires句の種類「module-info」ファイルには、用途に応じていくつかの種類の「requires」句が用意されています。1)requires <module>