mysql觸發器的例項

2021-08-07 20:36:33 字數 3760 閱讀 4090

mysql包含對觸發器的支援。觸發器是一種與表操作有關的資料庫物件,當觸發器所在表上出現指定事件時,將呼叫該物件,即表的操作事件觸發表上的觸發器的執行。

建立觸發器

在mysql中,建立觸發器語法如下:

**如下:

create trigger trigger_name

trigger_time

trigger_event on tbl_name

for each row

trigger_stmt

其中:trigger_name:標識觸發器名稱,使用者自行指定;

trigger_time:標識觸發時機,取值為 before 或 after;

trigger_event:標識觸發事件,取值為 insert、update 或 delete;

tbl_name:標識建立觸發器的表名,即在哪張表上建立觸發器;

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

由此可見,可以建立6種觸發器,即:before insert、before update、before delete、after insert、after update、after delete。

另外有乙個限制是不能同時在乙個表上建立2個相同型別的觸發器,因此在乙個表上最多建立6個觸發器。

trigger_event 詳解

mysql 除了對 insert、update、delete 基本操作進行定義外,還定義了 load data 和 replace 語句,這兩種語句也能引起上述6中型別的觸發器的觸發。

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

replace 語句一般來說和 insert 語句很像,只是在表中有 primary key 或 unique 索引時,如果插入的資料和原來 primary key 或 unique 索引一致時,會先刪除原來的資料,然後增加一條新資料,也就是說,一條 replace 語句有時候等價於一條。

insert 語句,有時候等價於一條 delete 語句加上一條 insert 語句。

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

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

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

begin … end 詳解

在mysql中,begin … end 語句的語法為:

begin

[statement_list]

end其中,statement_list 代表乙個或多個語句的列表,列表內的每條語句都必須用分號(;)來結尾。

而在mysql中,分號是語句結束的識別符號,遇到分號表示該段語句已經結束,mysql可以開始執行了。因此,直譯器遇到statement_list 中的分號後就開始執行,然後會報出錯誤,因為沒有找到和 begin 匹配的 end。

這時就會用到 delimiter 命令(delimiter 是定界符,分隔符的意思),它是一條命令,不需要語句結束標識,語法為:

delimiter new_delemiter

new_delemiter 可以設為1個或多個長度的符號,預設的是分號(;),我們可以把它修改為其他符號,如$:

delimiter $

在這之後的語句,以分號結束,直譯器不會有什麼反應,只有遇到了$,才認為是語句結束。注意,使用完之後,我們還應該記得把它給修改回來。

乙個完整的建立觸發器示例

假設系統中有兩個表:

班級表 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 ;

變數詳解

mysql 中使用 declare 來定義一區域性變數,該變數只能在 begin … end 復合語句中使用,並且應該定義在復合語句的開頭,

即其它語句之前,語法如下:

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

其中:var_name 為變數名稱,同 sql 語句一樣,變數名不區分大小寫;type 為 mysql 支援的任何資料型別;可以同時定義多個同型別的變數,用逗號隔開;變數初始值為 null,如果需要,可以使用 default 子句提供預設值,值可以被指定為乙個表示式。

對變數賦值採用 set 語句,語法為:

set var_name = expr [,var_name = expr] ...

new 與 old 詳解

上述示例中使用了new關鍵字,和 ms sql server 中的 inserted 和 deleted 類似,mysql 中定義了 new 和 old,用來表示

觸發器的所在表中,觸發了觸發器的那一行資料。

具體地:

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

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

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

使用方法: new.columnname (columnname 為相應資料表某一列名)

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

檢視觸發器

和檢視資料庫(show databases;)檢視**(show tables;)一樣,檢視觸發器的語法如下:

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 會回滾

mysql條件觸發器例項 mysql觸發器例項一則

例子,例項學習mysql觸發器的用法。一,準備二張測試表 1,測試表1 複製 示例 drop table if exists test create table test id bigint 11 unsigned not null auto increment,name varchar 100 n...

mysql觸發器例項

mysql從5.0開始支援觸發器 語法 create trigger 觸發器名稱 on 表名稱 for each row 觸發器sql語句 注意 在mysql中現在還不支援利用call來呼叫儲存過程 示例 比如有論壇的版塊表和文章表,乙個版塊中有多篇文章,在版塊表中有乙個字段用來記錄版塊下的文章數。...

mysql觸發器例項

有乙個學生管理程式,涉及到學生的證書,在這個程式裡,學生可以自己新增乙個或多個證書,把自己的證書資訊新增到系統裡,之後管理員對這些資訊進行審核,確定證書的真實性。當學員的所有證書都審核通過後,學員的狀態就會變為誠信,反之,只要有乙個證書沒有審核通過,學員狀態就變為非誠信。或者是學員又重新上傳了乙個證...