第二十五章 使用觸發器

2021-10-01 22:28:51 字數 2420 閱讀 3931

如果想要某條語句(或某些語句)在事件發生時自動執行,此時就需要觸發器。

如果需要在某個表發生更改時自動進行一些其他的處理。這確切地說就需要觸發器。

觸發器是mysql響應以下任意語句而自動執行的一條mysql語句(或位於 begin 和 end 語句之間的一組語 句):delete; insert; update,其他語句不支援觸發器。

建立觸發器時,需要4個條件:

mysql中觸發器名在每個表中必須唯一,但是在同乙個資料庫中的兩個錶可具有相同名字的觸發器。這個條件在其他的dbms中是不允許的,所以為了統一,最好在同乙個資料庫中,觸發器名設定成唯一的。

例子:

create trigger newproduct after insert on products

for each row select 'product added';

##create trigger--建立乙個叫newproduct的新觸發器

##after insert--此觸發器將在insert語句成功後執行

##for each row--**對每個插入行執行

##select 'product added' 顯示product added

注意:

drop trigger newproduct;
觸發器不能修改或者覆蓋,如要修改必須先刪除,再建立。

輸入

##order_ num為auto_increment列

create trigger neworder after insert on orders

for each row select new. order_ num ;

分析:

解釋下面出現的new:在insert觸發器**內,可引用乙個名為new的虛擬表,訪問被插入的行;

在before insert觸發器中修改new中的值也會在目標表中更新。對於auto_increment列,new在before insert觸發器中是0,在after insert觸發器中才是自動生成的值。

此**建立乙個名為neworder的觸發器,它按照after insert on orders執行。在插入乙個新訂單到orders表時,mysql生成乙個新訂單號並儲存到order_num中。觸發器從new. order_num取得 這個值並返回它。有上面的分析可知,new. order_ num返回自動生成的值。

輸入

##使用old儲存將要被刪除的行到乙個存檔表中

create trigger deleteorder before delete on orders

for each row

begin

insert into archive_ orders(order_ num, order_ date, cust_ id)

values(old.order_ _num, old.order_ date, old.cust_ _id) ;

end;

分析:

解釋下面出現的old:在delete觸發器**內,你可以引用乙個名為old的虛擬表,訪 問被刪除的行;old中的值全都是唯讀的,不能更新。

在任意訂單被刪除前將執行此觸發器。它使用一條insert語句 將 old 中的值(要被刪除的訂單)儲存到乙個名為 archive_ orders的存檔表中(為實際使用這個例子,你需要用與orders相同的列 建立乙個名為archive_orders的表)。

輸入

##保證州名縮寫總是大寫(不管update語句中給出的是大 寫還是小寫):

create trigger updatevendor before update on vendors

for each row set new. vend_ state = upper (new. vend_ state) ;

分析:

解釋下面出現的old和new:

在update觸發器**中,可以引用乙個名為old的虛擬表訪問以前(update語句執行之前)的值,引用乙個名為new的虛擬表訪問更新後的值;

在before update觸發器中,new中的值可能也被更新(允許更改將要用於update語句中的值);

old中的值全都是唯讀的,不能更新。

顯然,任何資料淨化都需要在update語句之前進行,就像這個例子中一樣。每次更新乙個行時,new.vend_state中的值(將用來更新錶行的值)都用upper(new.vend_state)替換。

本章介紹了什麼是觸發器以及為什麼要使用觸發器,學習了觸發器的型別和何時執行它們,列舉了幾個用於insert、delete和update操作的觸發器例子。

第二十五章 狂風

氈帳外寒風吹,而氈帳內卻很暖和。滕青山喝著熱奶茶,吃了大塊羊肉,還有大盆的手拌炒麵。雖然沒九州大地上菜餚精緻,可也是吃地全身舒坦。大哥!一名穿著灰色皮袍子的青年走進氈帳內。原先正和滕青山談的正高興的查布,見這人進來,不由臉色一沉 你來,有什麼事?嘖嘖。那青年瞥了滕青山一眼,當看到滕青山身上的破棉祅不...

第二十五章 中介者模式

中介者模式 ediator 用乙個中介物件來封裝一系列的物件互動。中介者使物件不需要顯示的相互引用,從而使其耦合鬆散,而且可以獨立的改變它們之間的互動。優點 ediator的出現減少了各個colleague的耦合,使得可以獨立改變和復用各個colleague類和mediator。由於把物件如何協作進...

WPF學習 第二十五章 日期控制項

wpf包含兩個日期控制項 calender和datepicker。這兩個控制項都被設計為允許使用者選擇日期。calendar控制項顯示日期,在與windows作業系統中看到的日曆 例如,當配置系統日期時看到的日曆 相似。該控制項每次顯示乙個月份,允許從乙個月份跳到另乙個月份 通過單擊箭頭按鈕 或跳到...