> For the complete documentation index, see [llms.txt](https://xu-min-chang.gitbook.io/caster-develop-note/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://xu-min-chang.gitbook.io/caster-develop-note/java/mysql/pai-cheng-event.md).

# 排程 - Event

MySQL事件（Events）是一種用於安排和自動執行指定任務或SQL語句的機制。它類似於作業系統上的計劃任務（cron jobs）或任何其他自動化工具，但在MySQL中實現。

## Create Event

```sql
DELIMITER //
CREATE EVENT event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
DO
BEGIN
    -- 執行的SQL語句或程式碼
END;
//
DELIMITER ;
```

* `event_name`：事件的名稱，應該是唯一的。
* `schedule`：事件的排程設定，包括頻率和開始時間。
* `ON COMPLETION [NOT] PRESERVE`：選擇是否在事件執行完成後保留事件。`PRESERVE`表示保留，否則事件將被刪除。
* `ENABLE | DISABLE`：您可以選擇啟用或禁用事件。默認情況下，事件是啟用的。
* `DO`：事件的執行內容，包括要執行的SQL語句或程式碼。

#### 排程設定

`schedule` 部分是事件的排程設定，可以使用以下選項：

* `EVERY interval`：指定事件的執行頻率，`interval` 可以是 `INTERVAL` 運算式，例如 `EVERY 1 DAY` 表示每天執行一次。
* `STARTS start_time`：指定事件的開始時間，可以是日期和時間的格式。事件將在這個時間之後開始執行。
* `ENDS end_time`：可選，指定事件的結束時間。事件將在這個時間之前停止執行。

#### 範例

每天早上7點開始都會執行一次，並且在執行完成後保留：

```sql
DELIMITER //
CREATE EVENT my_daily_event
ON SCHEDULE EVERY 1 DAY
STARTS TIMESTAMP(CURRENT_DATE, '07:00:00') -- 每天早上7點開始執行
ON COMPLETION PRESERVE
DO
BEGIN
    -- 執行您的SQL語句或程式碼
END;
//
DELIMITER ;
```

#### 管理事件

要查看現有事件，可以使用以下SQL語句：

```sql
SHOW EVENTS;
```

要啟用或禁用事件，可以使用以下語句：

```sql
ALTER EVENT event_name ENABLE;
ALTER EVENT event_name DISABLE;
```

要刪除事件，可以使用以下語句：

```sql
DROP EVENT event_name;
```

請注意，執行事件需要相應的權限。通常，只有具有事件權限的用戶才能創建、修改或刪除事件。

總之，MySQL Event 是一種強大的自動化工具，可用於處理定期執行的任務和簡化數據庫管理。請確保謹慎設計和設置事件，以確保其正確性和安全性。

#### 根據前面章節，針對分區增加排程機制，讓其真正做到全自動分區作業

```sql
DELIMITER ||
    -- 如果事件已經存在，就刪除名為`auto_part_event`的事件。這是為了確保不重複創建同一事件。
    DROP EVENT IF EXISTS `auto_part_event`;
    -- 創建一個事件，如果名稱為`auto_part_event`的事件不存在的話。
    CREATE EVENT IF NOT EXISTS `auto_part_event`
    
        -- 定義事件的執行計劃。在這裡，它被設置為每天執行一次。
        ON SCHEDULE EVERY 1 MONTH
            -- 定義事件的起始時間，表示從這個日期和時間開始執行事件。這個事件只有一個起始時間。
            -- 每月1號凌晨3點開始執行
            STARTS TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-01 03:00:00'))
    
        -- 設置事件在到期後是否應保留。使用PRESERVE表示事件在到期後不應自動刪除。
        ON COMPLETION PRESERVE
    
        -- 啟用事件，使其能夠執行。
        ENABLE

        -- 添加對事件的註解，用於描述事件的目的或功能。
        COMMENT 'event_auto_partition'

        -- 開始事件的執行內容區塊。
        DO BEGIN

        -- 在內容區塊中，調用存儲過程auto_part並傳遞特定參數，以管理表t_big_data_practise的分區。
        call auto_part('local_test', 't_big_data_practise', (SELECT DATE(MIN(`create_date`)) FROM t_big_data_practise), 1, 3);
    
    -- 結束內容區塊，並恢復分隔符。
    END||
DELIMITER ;
```

具體說明如下：

* `ON SCHEDULE EVERY 1 MONTH`：這部分設定了事件的執行頻率，每個月執行一次。
* `STARTS TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-01 03:00:00'))`：這部分設定了事件的開始時間。我們使用`NOW()`函數獲取當前日期和時間，然後使用`DATE_FORMAT`函數將其調整為每月的1號凌晨3點。這確保了事件在每月1號凌晨3點開始執行。
* `DO BEGIN` 和 `END||`：這是事件的執行內容區塊。在這個區塊中，我們調用了存儲過程`auto_part`，並傳遞了特定的參數，以管理表`t_big_data_practise`的分區。

該事件的目的是自動化管理表`t_big_data_practise`的分區。該事件每個月執行一次，不會自動刪除，確保了數據表的分區策略保持有效。
