日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql触发器新元组_MySQL触发器-条件触发器语法

發布時間:2024/4/13 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql触发器新元组_MySQL触发器-条件触发器语法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章為作者原創,未經許可,禁止轉載。??? -Sun Yat-sen University 馮興偉

實驗4觸發器

(1)實驗目的

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

(2)實驗內容和要求

定義BEFORE觸發器和AFTER觸發器。能夠理解不同類型觸發器的作用和執行原理,驗證觸發器的有效性。

(3)實驗重點和難點

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

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

此次實驗還是延用理論課本中出現的大學數據庫作為實驗例子。

(1).AFTER觸發器

i.? 在takes表上定義一個UPDATE觸發器,當takes表中元組的屬性grade被更新時,意味著學生上的這么課的課程成績被更新,需要用觸發器維護student里元組的tot_cred屬性,使其獲得的總學分保持實時更新。只有當屬性grade從空值或者’F’被更新為代表課程已經完成的具體分數時,觸發器才會被激發。

delimitercreate trigger credit_get after update

on takes foreach rowbeginif (NEW.grade <> ‘F‘ and NEW.grade is not nulland (OLD.grade = ‘F‘ or OLD.grade is null))thenupdatestudentset tot_cred = tot_cred +(selectcreditsfromcoursewhere 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約束,檢查插入時的參照完整性。

delimitercreate trigger timeslot_check1 after insert

on section foreach rowbeginif(NEW.time_slot_id not in(selecttime_slot_idfromtime_slot))thendelete fromsectionwhere 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的參照完整性。

delimitercreate trigger timeslot_check2 after delete

on time_slot foreach rowbeginif(OLD.time_slot_id not in(selecttime_slot_idfromtime_slot)and OLD.time_slot_id in(selecttime_slot_idfromsection))theninsert intotime_slotvalues(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值代替空白。

delimitercreate trigger setnull before insert

on takes foreach rowbeginif(NEW.grade = ‘ ‘)thenset 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可以同時使用。

原文:http://www.cnblogs.com/fengxw/p/6076150.html

總結

以上是生活随笔為你收集整理的mysql触发器新元组_MySQL触发器-条件触发器语法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。