資料庫之觸發器

2021-10-05 04:27:13 字數 1567 閱讀 2353

本篇介紹mysql中的觸發器,部分內容是筆者摘抄自《資料庫系統概念》,僅當作筆記。

觸發器(trigger)是一條語句,當對資料庫做修改時,它自動被系統執行。要設定觸發器機制,必須滿足兩個要求:

指明什麼條件下執行觸發器。它被分解為乙個引起觸發器被檢測的事件和乙個觸發器執行必須滿足的條件;

指明觸發器執行時的動作。一旦我們把乙個觸發器輸入資料庫,只要指定的事件發生,相應的條件滿足,資料庫系統就有責任去執行它。

mysql使用create trigger語句建立觸發器,其基本形式如下:

delimiter 結束識別符號

create trigger 觸發器名稱

on 表名

for each row

begin

《觸發器主體》

end 結束識別符號

delimiter ;

其中before和after是指此觸發器觸發時機,insert、update和delete是指觸發此觸發器的事件,for each row指關係中的任意乙個元組滿足觸發事件時都會觸發該觸發器。

在之前定義函式時的流程控制語句同樣可以使用在觸發器中,但觸發器比函式多了兩個關鍵字:new和old,它們都用來表示觸發器所在的關係中觸發了觸發器的那乙個元組,但他們表示的時間不同,表現在三種事件中如下:

insert:new表示將要或者已經插入的元組,此事件沒有old;

update:old表示更新之前的元組,new表示更新之後的元組;

delete:old表示將要刪除或已經刪除的元組,此事件沒有new。

在觸發器中都可以使用new.屬性名或old.屬性名來實現對新舊資料的讀或寫,在觸發器主體中這種形式類似與乙個引數,不同的是此」引數值「可能會永久儲存在資料庫中。例如在關係city中定義乙個觸發器,作用為在更新某個元組時,判斷如果is_hot屬性為1,則將state屬性更新為0,否則更新為1,其語句如下:

delimiter //

create trigger update_state

before update

on city

for each row

begin

if(old.is_hot = 1) then set new.state = 0;

else set new.state = 1;

end if;

end //

delimiter ;

在觸發器中也可以對其他表(非當前觸發器所在表)進行插入、更新和刪除操作,但不可以對當前表進行insert、update和delete操作,因為會造成迴圈呼叫。

檢視所有的觸發器的sql語句如下:

show triggers;
刪除指定觸發器的sql語句基本形式如下:

drop trigger 觸發器名稱;
mysql中的觸發器是按照before觸發器、元組操作和after觸發器的順序執行的,任何一步發生錯誤都不會繼續執行。另外,資料庫是針對關係中每一行資料且在我們使用時不知道當前關係是否有觸發器,當前表可能存在觸發器在修改當前表時修改其他表,維護成本大大增加。

資料庫之觸發器

觸發器 看到這個名字總是會想到數電中學過的觸發器,有輸入端和輸出端,根據電平的高低來觸發。資料庫中的觸發器是個特殊的儲存過程,主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名稱而被直接呼叫。作用 使用t sql語句進行複雜的邏輯處理,基於乙個表建立,但是可以對多個表進行操作,因此常常用...

資料庫之觸發器

觸發器 看到這個名字總是會想到數電中學過的觸發器,有輸入端和輸出端,根據電平的高低來觸發。資料庫中的觸發器是個特殊的儲存過程,主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名稱而被直接呼叫。作用 使用t sql語句進行複雜的邏輯處理,基於乙個表建立,但是可以對多個表進行操作,因此常常用...

資料庫之觸發器

1.概述 觸發器是特殊的儲存過程。儲存過程是由使用者主動去呼叫執行,觸發器是資料庫在發生一些事件的時候主動呼叫。常見的觸發器 sql server 有instead of 和 after for 資料庫為觸發器特別的建立兩張表 inserted表 deleted表 這兩張表由資料庫維護,存在記憶體中...