首頁 >資料庫 >mysql教程 >mysql中的觸發器用法實例詳解

mysql中的觸發器用法實例詳解

黄舟
黄舟原創
2017-06-04 10:01:211342瀏覽

這篇文章主要介紹了mysql 觸發器用法實例詳解的相關資料,需要的朋友可以參考下

 MySQL觸發器語法詳解:

        #         觸發器trigger是一種特殊的儲存過程














#都in
set

)、###刪除###(###delete###)或修改(up###date###)特定表中的資料時觸發執行,它比數據本身標準的功能更精細、更複雜的資料控制能力###。觸發器不是由程式調用,而是由某個###事件###來觸發的。在有資料修改時自動強制執行其業務規則,經常用於加強資料的完整性###約束###和業務規則等。觸發器可以###查詢###其他表,而且包含複製的sql語句。觸發器也可用於強制###引用###完整性。觸發器可以強制比用check約束定義的約束更為複雜的約束。 ############(F).CREATE TRIGGER語法############        CREATE TRIGGER trigger_nametrigger_####time### trigger_event ON tbl_name ###FOR# # ###EACH### ROW trigger_stmt;###        觸發程式是與表格相關的命名資料庫###物件###,當表格上出現特定事件時,將會啟動該物件。 ###        觸發程序與命名為tbl_name的表格有關。 tbl_name必須引用永久性表。不能將觸發程式與TEMPORARY表或###檢視###關聯起來。 ###        trigger_time是觸發程序的動作時間。它可以是###BEFORE###或AFTER,以指明觸發程式是在啟動它的語句之前或之後觸發。 ###        trigger_event指明了啟動觸發程序的語句的類型。 trigger_event可以是下述值之一:#########        (1).INSERT:將新行插入表時啟動觸發程序,例如,透過INSERT、LOAD DATA和REPLACE###語句。 ###       (2).UPDATE:變更某一行時啟動觸發程序,例如,透過UPDATE語句。 ###       (3).DELETE:從表中刪除某一行時啟動觸發程序,例如,透過DELETE和REPLACE語句。 #########請注意,trigger_event與以表格操作方式啟動觸發程式的SQL語句並不很類似,這點很重要。例如,關於INSERT的BEFORE觸發程序不僅能被INSERT語句激活,也能被LOAD DATA語句啟動。可能會造成混淆的例子之一是INSERT INTO .. ON DUPLICATE UPDATE ...語法:BEFORE INSERT觸發程序對於每一行將激活,後跟AFTER INSERT觸發程序,或BEFORE UPDATE和AFTER  UPDATE觸發程序,具體情況取決於行上是否有重複鍵。 #########      對於具有相同觸發程序動作時間和事件的給定表,不能有兩個觸發程序。例如,對於某一表,不能有兩個BEFORE UPDATE觸發程序。但可以有1個BEFORE UPDATE觸發程序和1個BEFORE  INSERT觸發程序,或1個BEFOREUPDATE觸發程序和1個AFTER UPDATE觸發程序。 trigger_stmt是當觸發程式啟動時執行的語句。如果你打算執行多個語句,可使用BEGIN ... ###END###複合語句結構。這樣,就能使用記憶體子程式中允許的相同語句############(二).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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn