MySQL觸發器實現

2019-10-16 22:55:55

在本教學中,您將了解MySQL觸發器實現。另外,我們將向展示MySQL如何將觸發器和觸發器的限制儲存在MySQL中。

MySQL觸發器簡介

在MySQL中,觸發器是一組SQL語句,當對相關聯的表上的資料進行更改時,會自動呼叫該語句。 觸發器可以被定義為在INSERTUPDATEDELETE語句更改資料之前或之後呼叫。在MySQL5.7.2版本之前,每個表最多可以定義六個觸發器。

  • BEFORE INSERT - 在資料插入表之前被啟用觸發器。
  • AFTER INSERT - 在將資料插入表之後啟用觸發器。
  • BEFORE UPDATE - 在表中的資料更新之前啟用觸發器。
  • AFTER UPDATE - 在表中的資料更新之後啟用觸發器。
  • BEFORE DELETE - 在從表中刪除資料之前啟用觸發器。
  • AFTER DELETE - 從表中刪除資料之後啟用觸發器。

但是,從MySQL 5.7.2+版本開始,可以為相同的觸發事件和動作時間定義多個觸發器

當使用不使用INSERTDELETEUPDATE語句更改表中資料的語句時,不會呼叫與表關聯的觸發器。 例如,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/yiibaidb/,並使用名為tablename.TRGtriggername.TRN的檔案:

  • tablename.TRG檔案將觸發器對映到相應的表。
  • triggername.TRN檔案包含觸發器定義。

可以通過將觸發器檔案複製到備份檔案夾來備份MySQL觸發器。也可以使用mysqldump工具備份觸發器

MySQL觸發限制

MySQL觸發器覆蓋標準SQL中定義的所有功能。 但是,在應用程式中使用它們之前,您應該知道一些限制。

MySQL觸發器不能:

  • 使用在SHOWLOAD DATALOAD TABLEBACKUP DATABASERESTOREFLUSHRETURN語句之上。
  • 使用隱式或明確提交或回滾的語句,如COMMITROLLBACKSTART TRANSACTIONLOCK/UNLOCK TABLESALTERCREATEDROPRENAME等。
  • 使用準備語句,如PREPAREEXECUTE
  • 使用動態SQL語句。

MySQL 5.1.4版本開始,觸發器可以呼叫儲存過程或儲存函式,在這之前的版本是有所限制的。

在本教學中,我們向您展示了如何在MySQL中實現觸發器。我們還討論了觸發器的儲存以及觸發器在MySQL中的局限性。