在本教學中,您將瞭解MySQL觸發器實現。另外,我們將向展示MySQL如何將觸發器和觸發器的限制存儲在MySQL中。
MySQL觸發器簡介
在MySQL中,觸發器是一組SQL語句,當對相關聯的表上的數據進行更改時,會自動調用該語句。 觸發器可以被定義為在INSERT,UPDATE或DELETE語句更改數據之前或之後調用。在MySQL5.7.2版本之前,每個表最多可以定義六個觸發器。
BEFORE INSERT
- 在數據插入表之前被啟動觸發器。AFTER INSERT
- 在將數據插入表之後啟動觸發器。BEFORE UPDATE
- 在表中的數據更新之前啟動觸發器。AFTER UPDATE
- 在表中的數據更新之後啟動觸發器。BEFORE DELETE
- 在從表中刪除數據之前啟動觸發器。AFTER DELETE
- 從表中刪除數據之後啟動觸發器。
但是,從MySQL 5.7.2+版本開始,可以為相同的觸發事件和動作時間定義多個觸發器。
當使用不使用INSERT
,DELETE
或UPDATE
語句更改表中數據的語句時,不會調用與表關聯的觸發器。 例如,TRUNCATE語句刪除表的所有數據,但不調用與該表相關聯的觸發器。
有些語句使用了後臺的INSERT
語句,如REPLACE語句或LOAD DATA語句。如果使用這些語句,則調用與表關聯的相應觸發器。
必須要為與表相關聯的每個觸發器使用唯一的名稱。可以為不同的表定義相同的觸發器名稱,這是一個很好的做法。
應該使用以下命名約定命名觸發器:
(BEFORE | AFTER)_tableName_(INSERT| UPDATE | DELETE)
例如,before_order_update
是更新orders
表中的行數據之前調用的觸發器。
以下命名約定與上述一樣。
tablename_(BEFORE | AFTER)_(INSERT| UPDATE | DELETE)
例如,order_before_update
與上述before_order_update
觸發器相同。
MySQL觸發存儲
MySQL在數據目錄中存儲觸發器,例如:/data/zaixiandb/
,並使用名為tablename.TRG
和triggername.TRN
的檔:
tablename.TRG
檔將觸發器映射到相應的表。triggername.TRN
檔包含觸發器定義。
可以通過將觸發器檔複製到備份檔夾來備份MySQL觸發器。也可以使用mysqldump工具備份觸發器。
MySQL觸發限制
MySQL觸發器覆蓋標準SQL中定義的所有功能。 但是,在應用程式中使用它們之前,您應該知道一些限制。
MySQL觸發器不能:
- 使用在
SHOW
,LOAD DATA
,LOAD TABLE
,BACKUP DATABASE,RESTORE
,FLUSH
和RETURN
語句之上。 - 使用隱式或明確提交或回滾的語句,如
COMMIT
,ROLLBACK
,START TRANSACTION
,LOCK/UNLOCK TABLES,ALTER
,CREATE
,DROP
,RENAME等。 - 使用準備語句,如
PREPARE
,EXECUTE
等 - 使用動態SQL語句。
從MySQL 5.1.4版本開始,觸發器可以調用存儲過程或存儲函數,在這之前的版本是有所限制的。
在本教學中,我們向您展示了如何在MySQL中實現觸發器。我們還討論了觸發器的存儲以及觸發器在MySQL中的局限性。