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

歡迎訪問 生活随笔!

生活随笔

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

数据库

【mysql】触发器的实例详解

發布時間:2023/12/20 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【mysql】触发器的实例详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、創建觸發器

a基本語法應用

CREATE TRIGGER trigger_nametrigger_timetrigger_event ON tbl_nameFOR EACH ROWtrigger_stmt

trigger_name:標識觸發器名稱,用戶自行指定;
trigger_time:標識觸發時機,取值為 BEFORE 或 AFTER;
trigger_event:標識觸發事件,取值為 INSERT、UPDATE、DELETE、LOAD DATA、REPLACE
tbl_name:標識建立觸發器的表名,即在哪張表上建立觸發器;
trigger_stmt:觸發器程序體,可以是一句SQL語句,或者用 BEGIN 和 END 包含的多條語句。

b語法詳解

DELIMITER $create trigger tri_stuInsert after inserton student for each rowbegindeclare c int;set c = (select stuCount from class where classID=new.classID);update class set stuCount = c + 1 where classID = new.classID;end$ DELIMITER ;
①trigger_event參數詳解

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 詳解
BEGIN[statement_list] END

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

注意:在mysql某些版本中,由于分號是語句結束的標識符,遇到分號表示該段語句已經結束,MySQL便會立即開始執行。所以,解釋器遇到statement_list 中的分號后會報出錯誤,因為沒有找到和 BEGIN 匹配的 END。
這時就會用到 DELIMITER 命令,它是一條命令,不需要語句結束標識

DELIMITER new_delemiter 例:DELIMITER $

new_delemiter 可以設為1個或多個長度的符號,默認的是分號(;)
DELIMITER ,才認為是語句結束。使用完之后,我們還應該記得把它給修改回來。

③DECLARE變量詳解

DECLARE 用來定義一局部變量,該變量只能在 BEGIN … END 復合語句中使用,并且應該定義在復合語句的開頭,

DECLARE var_name[,...] type [DEFAULT value] 例:declare c int;

var_name 為變量名稱,同 SQL 語句一樣,變量名不區分大小寫;
type 為 MySQL 支持的任何數據類型;可以同時定義多個同類型的變量,用逗號隔開;

SET var_name = expr [,var_name = expr] 例:set c = (select stuCount from class where classID=new.classID);

變量初始值為 NULL,如果需要,可以使用 DEFAULT子句提供默認值,值可以被指定為一個表達式。

④NEW 與 OLD 詳解
NEW.columnName

columnName 為相應數據表某一列名

在 INSERT 型觸發器中,NEW 用來表示將要(BEFORE)或已經(AFTER)插入的新數據;
在 UPDATE 型觸發器中,OLD 用來表示將要或已經被修改的原數據,NEW 用來表示將要或已經修改為的新數據;
在 DELETE 型觸發器中,OLD 用來表示將要或已經被刪除的原數據;

注意:OLD 是只讀的,而 NEW 則可以在觸發器中使用 SET 賦值,這樣不會再次觸發觸發器,造成循環調用(如每插入一個學生前,都在其學號前加“2013”)。

2、查看觸發器

SHOW TRIGGERS [FROM schema_name];

schema_name 即 Schema 的名稱

3、刪除觸發器

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

和刪除數據庫、刪除表格一樣

4、觸發器的執行順序

①如果 BEFORE 觸發器執行失敗,SQL 無法正確執行。
②SQL 執行失敗時,AFTER 型觸發器不會觸發。
③AFTER 類型的觸發器執行失敗,SQL 會回滾。

5、簡單實例

a創建表

DROP TABLE IF EXISTS tab1; CREATE TABLE tab1(tab1_id varchar(11) ); DROP TABLE IF EXISTS tab2; CREATE TABLE tab2(tab2_id varchar(11) );

b創建觸發器:t_afterinsert_on_tab1

作用:增加tab1表記錄后自動將記錄增加到tab2表中

DROP TRIGGER IF EXISTS t_afterinsert_on_tab1; CREATE TRIGGER t_afterinsert_on_tab1 AFTER INSERT ON tab1 FOR EACH ROW BEGINinsert into tab2(tab2_id) values(new.tab1_id); END;

測試一下

INSERT INTO tab1(tab1_id) values('0001'); SELECT * FROM tab1; SELECT * FROM tab2;

c創建觸發器:t_afterdelete_on_tab1

作用:刪除tab1表記錄后自動將tab2表中對應的記錄刪去

DROP TRIGGER IF EXISTS t_afterdelete_on_tab1; CREATE TRIGGER t_afterdelete_on_tab1 AFTER DELETE ON tab1 FOR EACH ROW BEGINdelete from tab2 where tab2_id=old.tab1_id; END;

測試一下

DELETE FROM tab1 WHERE tab1_id='0001';SELECT * FROM tab1; SELECT * FROM tab2;

總結

以上是生活随笔為你收集整理的【mysql】触发器的实例详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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