日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)數(shù)據(jù)庫教程:MySQL觸發(fā)器到底是什么?

MySQL 的觸發(fā)器和存儲過程一樣,都是嵌入到 MySQL 中的一段程序,是 MySQL 中管理數(shù)據(jù)的有力工具。不同的是執(zhí)行存儲過程要使用 CALL 語句來調(diào)用,而觸發(fā)器的執(zhí)行不需要使用 CALL 語句來調(diào)用,也不需要手工啟動,而是通過對數(shù)據(jù)表的相關操作來觸發(fā)、激活從而實現(xiàn)執(zhí)行。比如當對 student 表進行操作(INSERT,DELETE 或 UPDATE)時就會激活它執(zhí)行。

創(chuàng)新互聯(lián)長期為上1000+客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為湖濱企業(yè)提供專業(yè)的成都網(wǎng)站設計、成都做網(wǎng)站,湖濱網(wǎng)站改版等技術服務。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

觸發(fā)器與數(shù)據(jù)表關系密切,主要用于保護表中的數(shù)據(jù)。特別是當有多個表具有一定的相互聯(lián)系的時候,觸發(fā)器能夠讓不同的表保持數(shù)據(jù)的一致性。

在 MySQL 中,只有執(zhí)行 INSERT、UPDATE 和 DELETE 操作時才能激活觸發(fā)器,其它 SQL 語句則不會激活觸發(fā)器。

那么為什么要使用觸發(fā)器呢?比如,在實際開發(fā)項目時,我們經(jīng)常會遇到以下情況:

  • 在學生表中添加一條關于學生的記錄時,學生的總數(shù)就必須同時改變。
  • 增加一條學生記錄時,需要檢查年齡是否符合范圍要求。
  • 刪除一條學生信息時,需要刪除其成績表上的對應記錄。
  • 刪除一條數(shù)據(jù)時,需要在數(shù)據(jù)庫存檔表中保留一個備份副本。

 

雖然上述情況實現(xiàn)的業(yè)務邏輯不同,但是它們都需要在數(shù)據(jù)表發(fā)生更改時,自動進行一些處理。這時就可以使用觸發(fā)器處理。例如,對于第一種情況,可以創(chuàng)建一個觸發(fā)器對象,每當添加一條學生記錄時,就執(zhí)行一次計算學生總數(shù)的操作,這樣就可以保證每次添加一條學生記錄后,學生總數(shù)和學生記錄數(shù)是一致的。

觸發(fā)器的優(yōu)缺點

觸發(fā)器的優(yōu)點如下:

  • 觸發(fā)器的執(zhí)行是自動的,當對觸發(fā)器相關表的數(shù)據(jù)做出相應的修改后立即執(zhí)行。
  • 觸發(fā)器可以實施比 FOREIGN KEY 約束、CHECK 約束更為復雜的檢查和操作。
  • 觸發(fā)器可以實現(xiàn)表數(shù)據(jù)的級聯(lián)更改,在一定程度上保證了數(shù)據(jù)的完整性。

觸發(fā)器的缺點如下:

  • 使用觸發(fā)器實現(xiàn)的業(yè)務邏輯在出現(xiàn)問題時很難進行定位,特別是涉及到多個觸發(fā)器的情況下,會使后期維護變得困難。
  • 大量使用觸發(fā)器容易導致代碼結(jié)構被打亂,增加了程序的復雜性,
  • 如果需要變動的數(shù)據(jù)量較大時,觸發(fā)器的執(zhí)行效率會非常低。

MySQL 支持的觸發(fā)器

在實際使用中,MySQL 所支持的觸發(fā)器有三種:INSERT 觸發(fā)器、UPDATE 觸發(fā)器和 DELETE 觸發(fā)器。

1) INSERT 觸發(fā)器

在 INSERT 語句執(zhí)行之前或之后響應的觸發(fā)器。

使用 INSERT 觸發(fā)器需要注意以下幾點:

  • 在 INSERT 觸發(fā)器代碼內(nèi),可引用一個名為 NEW(不區(qū)分大小寫)的虛擬表來訪問被插入的行。
  • 在 BEFORE INSERT 觸發(fā)器中,NEW 中的值也可以被更新,即允許更改被插入的值(只要具有對應的操作權限)。
  • 對于 AUTO_INCREMENT 列,NEW 在 INSERT 執(zhí)行之前包含的值是 0,在 INSERT 執(zhí)行之后將包含新的自動生成值。

2) UPDATE 觸發(fā)器

在 UPDATE 語句執(zhí)行之前或之后響應的觸發(fā)器。

使用 UPDATE 觸發(fā)器需要注意以下幾點:

  • 在 UPDATE 觸發(fā)器代碼內(nèi),可引用一個名為 NEW(不區(qū)分大小寫)的虛擬表來訪問更新的值。
  • 在 UPDATE 觸發(fā)器代碼內(nèi),可引用一個名為 OLD(不區(qū)分大小寫)的虛擬表來訪問 UPDATE 語句執(zhí)行前的值。
  • 在 BEFORE UPDATE 觸發(fā)器中,NEW 中的值可能也被更新,即允許更改將要用于 UPDATE 語句中的值(只要具有對應的操作權限)。
  • OLD 中的值全部是只讀的,不能被更新。

注意:當觸發(fā)器設計對觸發(fā)表自身的更新操作時,只能使用 BEFORE 類型的觸發(fā)器,AFTER 類型的觸發(fā)器將不被允許。

3) DELETE 觸發(fā)器

在 DELETE 語句執(zhí)行之前或之后響應的觸發(fā)器。

使用 DELETE 觸發(fā)器需要注意以下幾點:

  • 在 DELETE 觸發(fā)器代碼內(nèi),可以引用一個名為 OLD(不區(qū)分大小寫)的虛擬表來訪問被刪除的行。
  • OLD 中的值全部是只讀的,不能被更新。

總體來說,觸發(fā)器使用的過程中,MySQL 會按照以下方式來處理錯誤。

對于事務性表,如果觸發(fā)程序失敗,以及由此導致的整個語句失敗,那么該語句所執(zhí)行的所有更改將回滾;對于非事務性表,則不能執(zhí)行此類回滾,即使語句失敗,失敗之前所做的任何更改依然有效。

若 BEFORE 觸發(fā)程序失敗,則 MySQL 將不執(zhí)行相應行上的操作。

若在 BEFORE 或 AFTER 觸發(fā)程序的執(zhí)行過程中出現(xiàn)錯誤,則將導致調(diào)用觸發(fā)程序的整個語句失敗。

僅當 BEFORE 觸發(fā)程序和行操作均已被成功執(zhí)行,MySQL 才會執(zhí)行 AFTER 觸發(fā)程序。


網(wǎng)頁題目:創(chuàng)新互聯(lián)數(shù)據(jù)庫教程:MySQL觸發(fā)器到底是什么?
文章起源:http://m.5511xx.com/article/codopge.html