mysql 觸發器 trigger用法 four

實驗4 觸發器

1)實驗目的數據庫

掌握數據庫觸發器的設計和使用方法spa

2)實驗內容和要求設計

定義BEFORE觸發器和AFTER觸發器。可以理解不一樣類型觸發器的做用和執行原理,驗證觸發器的有效性。3d

3)實驗重點和難點code

實驗重點:觸發器的定義。blog

實驗難點:利用觸發器實現較爲複雜的用戶自定義完整性。get

這次實驗仍是延用理論課本中出現的大學數據庫做爲實驗例子。it

(1).    AFTER觸發器io

i.  在takes表上定義一個UPDATE觸發器,當takes表中元組的屬性grade被更新時,意味着學生上的這麼課的課程成績被更新,須要用觸發器維護student裏元組的tot_cred屬性,使其得到的總學分保持實時更新。只有當屬性grade從空值或者’F’被更新爲表明課程已經完成的具體分數時,觸發器纔會被激發。class

複製代碼
delimiter 
create trigger credit_get after update on takes for each row begin     if (NEW.grade <> 'F' and NEW.grade is not null               and (OLD.grade = 'F' or OLD.grade is null))        then     update student     set tot_cred = tot_cred +               (select credits         from course         where course.course_id = NEW.course_id)         where student.ID = NEW.ID;  end if;  end;
複製代碼

ii.  在section表上定義一個INSERT觸發器,當對課程section表執行任何插入操做後觸發器被啓動,以確保插入元組的time_slot_id屬性即上課時間段是合法的,受time_slot表的time_slot_id約束,檢查插入時的參照完整性。

複製代碼
delimiter 
create trigger timeslot_check1 after insert on section for each row begin        if(NEW.time_slot_id not in               (select time_slot_id          from time_slot))        then        delete from section     where time_slot_id = NEW.time_slot_id; end if; end
複製代碼

iii.  在time_slot表上定義一個DELETE觸發器,當刪除的元組的time_slot_id不在刪除後的time_slot表中時,且section中存在包含這個time_slot_id 值的元組時,觸發器被啓動,以確保time_slot中發生刪除時,section的參照完整性。

複製代碼
delimiter 
create trigger timeslot_check2 after delete on time_slot for each row begin        if(OLD.time_slot_id not in               (select time_slot_id          from time_slot)          and OLD.time_slot_id in               (select time_slot_id          from section))        then        insert into time_slot               values(OLD); end if; end
複製代碼

iv.   驗證定義在takes表上的AFTER UPDATE觸發器

  初始時編號999的學生在493這門課成績爲F,即不經過,沒法得到學分:

  且其已獲學分爲15:

 

  假設補考事後其成績爲B,需更新takes:

 

  定義在takes表上的UPDATE觸發器觸發,此時學生的總學分應該增長:

 

從上圖能夠看到UPDATE觸發器觸發成功。

(2).    BEFORE觸發器

Before觸發器的update,insert,delete語句語法和after觸發器基本相似,故此下面再也不贅述所有三種語句,只拿BEFORE INSERT觸發器作爲例子。

i.                     在takes表上定義一個before insert觸發器,插入一條記錄時,假設所插入的分數的

值爲空白則代表該分數發生缺失,因此定義此觸發器在分數值條件知足時觸發用null值代替空白。

複製代碼
delimiter 
create trigger setnull before insert on takes for each row begin        if(NEW.grade = ' ')     then     set NEW.grade = null; end if; end
複製代碼

ii.  驗證定義在takes表上的BEFORE INSERT觸發器

 初始時:

 編號爲999的學生只有一門課

 

 假設該學生如今上了另外一門課,插入元組,且該課程成績缺失還沒給出:

 

 查看該學生所上課程的信息:

 

 從上表能夠看出takes表上的BEFORE INSERT觸發器觸發成功。

iii.  刪除觸發器

 drop trigger setnull;

 

 

總結:

after觸發器—是在記錄操縱以後觸發,是先完成數據的增刪改,再觸發,觸發的語句晚於監視的增刪改操做,沒法影響前面的增刪改動做
before觸發器—是在記錄操縱以前觸發,是先完成觸發,再增刪改,觸發的語句先於監視的增刪改,咱們就有機會判斷,修改即將發生的操做,如:咱們在觸發以前須要判斷new值和old值的大小或關係,若是知足要求就觸發,不經過就修改再觸發;如:表之間定義的有外鍵,在刪除主鍵時,必需要先刪除外鍵表,這時就有前後之分,這裏before至關於設置了斷點,咱們能夠處理刪除外鍵。

對於INSERT語句, 只有NEW是合法的;

對於DELETE語句,只有OLD才合法;

對於UPDATE語句,NEW、OLD能夠同時使用。

相關文章
相關標籤/搜索