mysql 觸發器用法例項詳解

2022-10-05 00:48:21 字數 3643 閱讀 8374

mysql觸發器語法詳解:

觸發器 trigger是一種特殊的儲存過程,他在插入(inset)、刪除(delete)或修改(update)特定表中的資料時觸發執行,它比資料本身標準的功能更精細和更複雜的資料控制能力。觸發器不是由程式呼叫,而是由某個事件來觸發的。在有資料修改時自動強制執行其業務規則,經常用於加強資料的完整性約束和業務規則等。觸發器可以查詢其他表,而且包含複製的sql語句。觸發器也可用於強制引用完整性。觸發器可以強制比用check約束定義的約束更為複雜的約束

(一).create trigger語法

ezkfvpkacreate 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 trans程式設計客棧action、

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 o account for each row set @sum = @sum + new.amount;

本文標題: mysql 觸發器用法例項詳解

本文位址:

SQL Server的觸發器用法

dml 資料操縱語言 data manipulation language 觸發器 一 建立觸發器 create trigger 觸發器名字 on 表名 for after instead of insert update delete as if begin sql 語句 rollback tra...

mysql觸發器new old用法詳解

1.當使用insert語句的時候,如果原表中沒有資料的話,那麼對於插入資料後表來說新插入的那條資料就是new,如圖所示 2.當使用delete語句的時候,刪除的那一條資料相對於刪除資料後表的資料來說就是od,如圖所示 3.當使用update語句的時候,當修改原表資料的時候相對於修改資料後表的資料來說...

資料庫觸發器用法總結

最近了解了一下資料庫觸發器,並做一點實際的應用,在翻看其概念的時候,還是本著從理解的角度來學習的,但是,到了實際的應用場景中,還是有一些特別注意的地方的,下面是自己在應用中的幾點體會 1 針對較為複雜的跨多表的資料業務級別的約束,可以通過觸發器來替代大量的後台判斷 效率較高且便捷。2 如果想通過觸發...