Navicat 部落格

2018 年 7 月 3 日,由 Robert Gravelle 撰寫

歡迎回到我們的資料庫事件系列!第 1 部分概述了資料庫事件和排程工有何不同,以及如何在 MySQL 中配置事件排程器執行緒。在本篇文章中,我們將探討如何使用 CREATE EVENT 語法建立 MySQL 事件。

建立新的 MySQL 事件

建立事件類似於建立其他資料庫物件,例如預存程序或函式。與這些物件一樣,事件是包含 SQL 語句的命名資料庫物件。這是基本語法:

CREATE EVENT [IF NOT EXIST] event_name
ON SCHEDULE schedule
DO
event_body

有幾點需要注意:

  • 事件名稱在資料庫結構描述中必須是唯一的。
  • 如果事件主體中有多個 SQL 語句,則可以將它們包裝在 BEGIN END 區塊中。

讓我們使用上面的語法建立一個實際的事件。我們將定義和安排一次性事件,將訊息插入名稱為 messages 的資料表中。

    首先,找到合適的測試資料庫或建立一個新的測試資料庫。 然後使用 CREATE TABLE 語句建立一個名稱為「messages」的新資料表,如下所示:

    	CREATE TABLE IF NOT EXISTS messages (
    		id INT PRIMARY KEY AUTO_INCREMENT,
    		message VARCHAR(255) NOT NULL,
    		created_at DATETIME NOT NULL
    	);
    	

  • 現在是時候使用 CREATE EVENT 語句建立我們的事件了:
    		CREATE EVENT IF NOT EXISTS test_event
    		ON SCHEDULE AT CURRENT_TIMESTAMP
    		DO
    		  INSERT INTO messages(message,created_at)
    		  VALUES('Test MySQL Event 1',NOW());
    		 

  • ⦁ 那個事件應該立即將我們的訊息加入 messages 資料表中。讓我們發出SELECT ALL 來檢查 messages 資料表:

在完成後保留事件

事件過期時會自動刪除。像我們建立的一次性事件,它會在完成執行時過期。

我們可以在 MySQL 命令提示字元發出以下語句來檢視資料庫結構描述的所有事件:

mysql> SHOW EVENTS FROM test;
Empty set

若要使事件在過期後仍然保留,我們可以使用 ON COMPLETION PRESERVE 子句。以下是建立另一個一次性事件的語句,該事件在建立後 30 秒執行,並且在執行後不會被刪除:

CREATE EVENT test_event_2
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 30 SECOND
ON COMPLETION PRESERVE
DO
   INSERT INTO messages(message,created_at)
   VALUES('Test MySQL Event 2',NOW());

等待至少 30 秒並檢查 messages 資料表。這應加入了另一筆記錄:

讓我們再次執行 SHOW EVENTS 語句。因為 ON COMPLETION PRESERVE 子句的效果,你可以看到事件在那裡(雖然處於 DISABLED 狀態):

mysql> SHOW EVENTS FROM test;
+------+--------------+----------------+-----------+----------+---------------------+----------------+----------------+--------+------+----------+------------+----------------------+----------------------+--------------------+
| Db   | Name         | Definer        | Time zone | Type     | Execute at          | Interval value | Interval field | Starts | Ends | Status   | Originator | character_set_client | collation_connection | Database Collation |
+------+--------------+----------------+-----------+----------+---------------------+----------------+----------------+--------+------+----------+------------+----------------------+----------------------+--------------------+
| test | test_event_2 | root@localhost | SYSTEM    | ONE TIME | 2018-06-07 15:08:00 | NULL           | NULL           | NULL   | NULL | DISABLED |          1 | utf8mb4              | utf8mb4_general_ci   | utf8_general_ci    |
+------+--------------+----------------+-----------+----------+---------------------+----------------+----------------+--------+------+----------+------------+----------------------+----------------------+--------------------+
1 row in set (0.02 sec)
Navicat 文章
頻道記錄
分享
部落格封存檔