MySQL - 觸發器



通常,觸發器被定義為對事件的響應。在 MySQL 中,觸發器是一種駐留在系統目錄中的特殊儲存過程,它在執行事件時自動執行(不像常規儲存過程那樣需要顯式呼叫)。這些事件包括 INSERT、UPDATE 和 DELETE 等語句。

要執行 MySQL 觸發器,使用者必須具有管理員/超級使用者許可權。

根據 SQL 標準,觸發器通常分為兩類:

  • 行級觸發器:僅在資料庫表中插入、更新或刪除每一行時才執行的觸發器。MySQL 只支援這種型別的觸發器。

  • 語句級觸發器:這類觸發器在事務級別執行一次,無論表中修改了多少行。MySQL 不支援這種型別的觸發器。

MySQL 中的觸發器型別

MySQL 中有六種型別的行級觸發器,它們是:

  • BEFORE INSERT 觸發器

  • AFTER INSERT 觸發器

  • BEFORE UPDATE 觸發器

  • AFTER UPDATE 觸發器

  • BEFORE DELETE 觸發器

  • AFTER DELETE 觸發器

BEFORE INSERT 觸發器

BEFORE INSERT 觸發器在任何值插入到表中之前執行。每當執行 INSERT 語句時,BEFORE INSERT 觸發器就會啟動,然後是插入事務。

AFTER INSERT 觸發器

AFTER INSERT 觸發器的工作方式與 BEFORE INSERT 觸發器相反。顧名思義,它是在任何值插入到表中之後執行的。每當執行 INSERT 語句時,值首先插入到表中,然後執行觸發器。

BEFORE UPDATE 觸發器

BEFORE UPDATE 觸發器在任何值在表中更新或修改之前執行。每當執行 UPDATE 語句時,BEFORE UPDATE 觸發器就會啟動,然後是更新事務。

AFTER UPDATE 觸發器

AFTER UPDATE 觸發器的工作方式與 BEFORE UPDATE 觸發器相反。顧名思義,它是在任何值在表中更新之後執行的。每當執行 UPDATE 語句時,值首先在表中更新,然後執行觸發器。

BEFORE DELETE 觸發器

BEFORE DELETE 觸發器在任何值從表中刪除之前執行。每當執行 DELETE 語句時,BEFORE DELETE 觸發器就會啟動,然後是刪除事務。

AFTER DELETE 觸發器

AFTER DELETE 觸發器的工作方式與 BEFORE DELETE 觸發器相反。顧名思義,它是在任何值從表中刪除之後執行的。每當執行 DELETE 語句時,值首先從表中刪除,然後執行觸發器。

觸發器的優點

觸發器在 MySQL 資料庫中有很多優點,它們列舉如下:

  • 觸發器幫助資料庫維護儲存資料的完整性。

  • 觸發器也是從資料庫層本身處理錯誤的一種方法。

  • 由於觸發器是自動呼叫的,無需顯式呼叫,因此您無需等待計劃事件執行。

  • 觸發器可用於透過記錄事件來跟蹤對錶所做的資料更改。

  • MySQL 觸發器還可以防止執行無效的事務。

觸發器的缺點

但是,在 MySQL 資料庫中使用觸發器也有一些缺點,其中一些列舉如下:

  • 觸發器不能替代所有驗證,只能提供擴充套件驗證。對於簡單的驗證,可以使用 NOT NULL、UNIQUE、CHECK 和 FOREIGN KEY 約束。

  • 由於觸發器對客戶端應用程式是不可見的,因此無法理解資料庫層中發生的情況。因此,難以進行故障排除。

  • 觸發器不適用於高速資料,即每秒事件數量較高的資料。

  • 觸發器可能會增加 MySQL 伺服器的開銷。

觸發器的限制

以下是適用於 MySQL 觸發器的一些限制:

  • 每個事件一個觸發器 - 每個表對每個事件組合只能有一個觸發器,即不能為同一表定義兩個相同的觸發器。

  • 不允許使用 RETURN 語句 − 由於觸發器不返回值,因此不允許使用 RETURN 語句。

  • 外部索引鍵約束 − 外部索引鍵操作不會啟用觸發器。

  • 元資料過期 − 假設觸發器已載入到快取中,當表元資料更改時,它不會自動重新載入。在這種情況下,觸發器可能會使用過時的元資料進行操作。

  • 無法使用 'CALL' 語句 − 在觸發器中無法使用 CALL 語句。

  • 無法建立臨時表或檢視 − 無法為臨時表或檢視建立檢視。

  • 不會因 INFORMATION_SCHEMA 的更改而啟用 − 實際上,INFORMATION_SCHEMA 或 performance_schema 表中的更改不會啟用觸發器。這是因為這些表是檢視,而檢視上不允許使用觸發器。

廣告