觸發器是與 MySQL 資料表相關的資料庫對象,在滿足定義條件時觸發,並執行觸發器中定義的語句集合。觸發器的這種特性可以協助應用在資料庫端確保資料的完整性。
語法格式如下:
CREATE <触发器名> < BEFORE | AFTER > <INSERT | UPDATE | DELETE > ON <表名> FOR EACH Row<触发器主体>
語法說明如下。
1) 觸發器名稱
觸發器的名稱,觸發器在目前資料庫中必須具有唯一的名稱。如果要在某個特定資料庫中創建,名稱前面應該加上資料庫的名稱。
2) INSERT | UPDATE | DELETE
觸發事件,用來指定啟動觸發器的語句的種類。
注意:三種觸發器的執行時間如下。 INSERT:將新行插入表時啟動觸發器。例如,INSERT 的 BEFORE 觸發器不僅能被 MySQL 的 INSERT 語句激活,也能被 LOAD DATA 語句啟動。 DELETE: 從表格中刪除某一行資料時啟動觸發器,例如 DELETE 和 REPLACE 語句。 UPDATE:在變更表中某行資料時啟動觸發器,例如 UPDATE 語句。
3) BEFORE | AFTER
BEFORE 和 AFTER,觸發器被觸發的時刻,表示觸發器是在啟動它的語句之前或之後觸發。若希望驗證新資料是否符合條件,則使用 BEFORE 選項;若希望在啟動觸發器的語句執行之後完成幾個或更多的改變,則通常使用 AFTER 選項。
4) 表名
與觸發器相關聯的表名,此表必須是永久性表,不能將觸發器與臨時表或檢視關聯起來。在該表上觸發事件發生時才會啟動觸發器。同一個表不能擁有兩個具有相同觸發時刻和事件的觸發器。例如,對於一張資料表,不能同時有兩個 BEFORE UPDATE 觸發器,但可以有一個 BEFORE UPDATE 觸發器和一個 BEFORE INSERT 觸發器,或一個 BEFORE UPDATE 觸發器和一個 AFTER UPDATE 觸發器。
5) 觸發器主體
觸發器動作主體,包含觸發器啟動時將要執行的 MySQL 語句。如果要執行多個語句,可使用 BEGIN…END 複合語句結構。
6) FOR EACH ROW
一般是指行級觸發,對於受觸發事件影響的每一行都要啟動觸發器的動作。例如,使用 INSERT 語句向某個表中插入多行資料時,觸發器會對每一行資料的插入都執行對應的觸發器動作。
注意:每個表都支援 INSERT、UPDATE 和 DELETE 的 BEFORE 與 AFTER,因此每個表最多支援 6 個觸發器。每個表的每個事件每次只允許有一個觸發器。單一觸發器不能與多個事件或多個表關聯。
另外,在 MySQL 中,若需要查看資料庫中已有的觸發器,則可以使用 SHOW TRIGGERS 語句。
範例:
BEGIN IF new.state in ('2','3') then INSERT INTO `userservice`.`ehome_us_green_examine` (modifydate,modifyuser,brancCode,stateDescription,state, userID,fromSystemkey,applydate,makeHospitalName,illnessName, userName,rightsholderName,tranno) VALUES ( sysdate(), 'manage', old.brancCode, old.stateDescription, new.state, '', old.fromSystemkey, old.applydate,old.makeHospitalName,old.illnessName, old.userName,old.rightsholderName, old.tranno); END IF; END
這個觸發器比較簡單,
1、BEGIN到END,之間是對資料庫的操作
2、IF到END IF之間是判斷,你想的對,就是如果。 。 。的意思
3、new.state in ('2','3') 這句話的意思是:該表的字段state為(2或3)的時候
4、執行下面的插入語句,new為新值,old是原來的值(如old.userName就是原來的這個欄位的值)
#5、整個觸發器翻譯成白話就是,如果該表的state變成2或3的時候,執行下面的插入語句
備註:那麼觸發器是發生在狀態變化之前還是之後呢?選Before或After,顧名思義!
以上是mysql觸發器怎麼寫的詳細內容。更多資訊請關注PHP中文網其他相關文章!