本文主要介紹了mysql 觸發器用法實例詳解的相關資料,需要的朋友可以參考下,希望能幫助到大家。
MySQL觸發器語法詳解:
觸發器trigger是一種特殊的儲存過程,他在插入(inset)、刪除(delete)或修改(update)特定表中的資料時觸發執行,它比資料本身標準的功能更精細和更複雜的資料控制能力。觸發器不是由程式調用,而是由某個事件來觸發的。在有資料修改時自動強制執行其業務規則,經常用於加強資料的完整性約束和業務規則等。觸發器可以查詢其他表,而且包含複製的sql語句。觸發器也可用於強制引用完整性。觸發器可以強制比用check約束定義的約束更為複雜的約束。
(F).CREATE TRIGGER語法
CREATE TRIGGER trigger_nametrigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmtmger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt;當表上出現特定事件時,將啟動該物件。
觸發程序與命名為tbl_name的表格有關。 tbl_name必須引用永久性表。不能將觸發程式與TEMPORARY表或檢視關聯起來。
trigger_time是觸發程序的動作時間。它可以是BEFORE或AFTER,以指明觸發程序是在啟動它的語句之前或之後觸發。
trigger_event指明了啟動觸發程序的語句的類型。 trigger_event可以是下述值之一:
語句。
(2).UPDATE:變更某一行時啟動觸發程序,例如,透過UPDATE語句。
(3).DELETE:從表中刪除某一行時啟動觸發程序,例如,透過DELETE和REPLACE語句。
##(二).DROP TRIGGER語法
DROP TRIGGER[schema_name.]trigger_name捨棄觸發程式。方案名稱(schema_name)是可選的。如果省略了schema(方案),將從目前方案中捨棄觸發程式。
註:從MySQL 5.0.10之前的MySQL版本升級到5.0.10或更高版本時(包括所有的MySQL5.1版本),必須在升級之前捨棄所有的觸發程序,並在隨後重新創建它們,否則,在升級之後DROP TRIGGER不工作。 DROP TRIGGER語句需要SUPER權限。
(三).使用觸發程序
在本節中,介紹了在MySQL 5.1中使用觸發程序的方法,並介紹了在使用觸發程序方面的限制。
觸發程式是與表格相關的命名資料庫對象,當表格上出現特定事件時,將啟動該物件。在某些觸發程序的用法中,可用於檢查插入到表中的值,或對更新涉及的值進行計算。
觸發程式與資料表相關,當對錶執行INSERT、DELETE或UPDATE語句時,將啟動觸發程式。觸發程序可以設定為在執行語句之前或之後啟動。例如,可以在從表中刪除每一行之前,或在更新了,每一行後啟動觸發程式。若要建立觸發程序或捨棄觸發程序,可使用CREATE TRIGGER或DROP TRIGGER語句.觸發程序不能呼叫將資料傳回客戶端的儲存程序,也不能使用採用CALL語句的動態SQL(允許儲存程式透過參數將資料傳回觸發程式).
觸發程序不能使用以明確或隱式方式開始或結束事務的語句,如START TRANSACTION、
COMMIT或ROLLBACK。
使用OLD和NEW關鍵字,能夠存取受觸發程式影響的行中的欄位(OLD和NEW不區分大小寫)。
在INSERT觸發程式中,只能使用NEW.col_name,沒有舊行。在DELETE觸發程式中,只能使用OLD.col_name,沒有新行。在UPDATE觸發程式中,可以使用OLD.col_name來引用更新前的某一行的列,也能使用NEW.col_name來引用更新後的行中的列。
用OLD命名的欄位是唯讀的。你可以引用它,但不能更改它。對於用NEW命名的列,如果具有SELECT權限,可引用它。在BEFORE觸發程式中,如果你有UPDATE權限,可使用「SET NEW.col_name = value」來變更它的值。這意味著,你可以使用觸發程序來更改將要插入新行中的值,或用於更新行的值。在BEFORE觸發程序中,AUTO_INCREMENT列的NEW值為0,不是實際插入新記錄時會自動產生的序號。
透過使用BEGIN ...END結構,能夠定義執行多條語句的觸發程序。在BEGIN區塊中,還能使用儲存子程式中允許的其他語法,如條件和循環等。但是,正如儲存子程序那樣,定義執行多條語句的觸發程序時,如果使用mysql程序來輸入觸發程序,需要重新定義語句分隔符,以便能夠在觸發程序定義中使用字元“;”。在下面的範例中,示範了這些要點。在這個範例中,定義了1個UPDATE觸發程序,用於檢查更新每一行時將使用的新值,並更改值,使之位於0~100的範圍內。它必須是BEFORE觸發程序,這是因為,需要在將值用於更新行之前對其進行檢查:
mysql> delimiter // mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account -> FOR EACH ROW -> BEGIN -> IF NEW.amount < 0 THEN -> SET NEW.amount = 0; -> ELSEIF NEW.amount > 100 THEN -> SET NEW.amount = 100; -> END IF; -> END;// mysql> delimiter ;
較為簡單的方法是,單獨定義存儲程序,然後使用簡單的CALL語句從觸發程序呼叫儲存程式。如果你打算從數個觸發程序內部呼叫相同的子程序,該方法也很有幫助。在觸發程序的執行過程中,MySQL處理錯誤的方式如下:
(1)如果BEFORE觸發程序失敗,則不執行對應行上的動作。
(2)只有當BEFORE觸發程序(如果有的話)和行操作都已成功執行,才執行AFTER觸發程序。
(3) 若在BEFORE或AFTER觸發程式的執行過程中出現錯誤,將導致整個呼叫觸發程式的語句的失敗。
(4)對於事務性表,如果觸發程序失敗(以及由此導致的整個語句的失敗),則該語句所執行的所有變更將回滾。對於非事務性表,不能執行這類回滾,因而,即使語句失敗,失敗之前所做的任何變更依然有效。
例一:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;
相關推薦:
以上是mysql 觸發器用法實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!