資料庫觸發器知識總結

2021-09-12 15:40:12 字數 2467 閱讀 3480

create trigger trigger_name

trigger_time

trigger_event on tbl_name

for each row

trigger_stmt

trigger:觸發器關鍵字

trigger_name:觸發器名稱

trigger_time:觸發時機(before或after)

trigger_event:觸發事件(insert、update 或 delete)

tbl_name:建立觸發器的表名

for each row:        每行受影響,觸發器都執行,叫行級觸發器。        oracle觸發器中,分行級觸發器和語句觸發器,可不寫for each row,即無論影響多少行都只執行一次。        mysql不支援語句觸發器,所以必須寫for each row

trigger_stmt:觸發器程式體,可以是一句sql語句或者用begin和end包含的多條語句。

注:不能在乙個表上建立兩個相同型別的觸發器。觸發器型別有:before insert、before update、before delete、after insert、after update、after delete。

在mysql中,還定義了load data 和 replace 語句。

load data 語句將乙個檔案裝入到乙個資料表中,相當於一系列的insert操作。

replace 語句當資料發生替代,即當插入的資料和原來的資料的主鍵或唯一索引相同時,會先把原先的資料刪除,再插入一條新的資料。

insert 型觸發器:插入某一行時啟用觸發器,可能通過 insert、load data、replace 語句觸發;

update 型觸發器:更改某一行時啟用觸發器,可能通過 update 語句觸發;

delete 型觸發器:刪除某一行時啟用觸發器,可能通過 delete、replace 語句觸發。

begin

[statement_list]

end解釋:

statement_list代表乙個或多個語句,以分號(;)結尾,這個與mysql中分號是語句結束符相衝突,所以需要用delimiter命令修改分隔符。語法如下:

delimiter new_delemiter

new_delemiter 可以設為乙個或多個長度的符號,預設的是分號(;)

假設系統中有兩個表:

班級表 class(班級號 classid, 班內學生數 stucount)

學生表 student(學號 stuid, 所屬班級號 classid)

要建立觸發器來使班級表中的班內學生數隨著學生的新增自動更新,**如下:

delimiter $

create trigger tri_stuinsert after insert

on student for each row

begin

declare c int;

set c = (select stucount from class where classid=new.classid);

update class set stucount = c + 1 where classid = new.classid;

end$

delimiter ;

declare 定義區域性變數,該變數只能在begin...end符合語句中使用,並且定義在開頭。語法如下:

declare var_name[,...] type [default value]

其中:var_name 為變數名稱

default value 預設值為null

在 insert 型觸發器中,new 用來表示將要(before)或已經(after)插入的新資料;

在 update 型觸發器中,old 用來表示將要或已經被修改的原資料,new 用來表示將要或已經修改為的新資料;

在 delete 型觸發器中,old 用來表示將要或已經被刪除的原資料;

注:old 是唯讀的,而 new 則可以在觸發器中使用 set 賦值,這樣不會再次觸發觸發器,造成迴圈呼叫(如每插入乙個學生前,都在其學號前加「2013」)。

show triggers [from schema_name];

其中,schema_name 即 schema 的名稱,在 mysql 中 schema 和 database 是一樣的,也就是說,可以指定資料庫名,這樣就不必先「use database_name;」了。

drop trigger [if exists] [schema_name.]trigger_name

我們建立的資料庫一般都是 innodb 資料庫,其上建立的表是事務性表,也就是事務安全的。這時,若sql語句或觸發器執行失敗,mysql 會回滾事務,有:

①如果 before 觸發器執行失敗,sql 無法正確執行。

②sql 執行失敗時,after 型觸發器不會觸發。

③after 型別的觸發器執行失敗,sql 會回滾

資料庫總結九觸發器

在sql server 2005中,觸發器可以分為兩大類 dml觸發器和ddl觸發器 dml觸發器 dml觸發器是當資料庫伺服器中發生資料操作語言 data manipulation language 事件時執行的儲存過程。dml觸發器又分為兩類 after觸發器和instead of觸發器 ddl...

資料庫實驗 觸發器知識點總結

觸發器概述 觸發器是一種特殊型別的儲存過程 它無法顯示地執行,相反,它依附於乙個事件。每當事件發生時,觸發觸發器並執行觸發器的 觸發器的分類 sql server 支援與兩類事件併聯的觸發器,一類是資料操作的事件 dml觸發器 如insert 另一類是資料定義事件 ddl觸發器 如create ta...

資料庫觸發器

觸發器是一種特殊型別的儲存過程,它不同於我們前面介紹過的儲存過程。觸發器主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名字而 被直接呼叫。當對某一表進行諸如update insert delete 這些操作時,sql server 就會自動執行觸發器所定義的sql 語句,從而確保對資料...