首頁 >資料庫 >mysql教程 >mysql 觸發器用法實例分享

mysql 觸發器用法實例分享

小云云
小云云原創
2018-01-17 10:06:441176瀏覽

本文主要介紹了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可以是下述值之一:

        (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專案中用來做資訊備份、恢復與清空

關於MySQL觸發器的問題

#mysql觸發器簡介及如何建立和移除觸發器

以上是mysql 觸發器用法實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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