# 排程 - Event

## 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`的分區。該事件每個月執行一次，不會自動刪除，確保了數據表的分區策略保持有效。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://xu-min-chang.gitbook.io/caster-develop-note/java/mysql/pai-cheng-event.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
