【mysql】触发器的实例详解
1、創(chuàng)建觸發(fā)器
a基本語法應(yīng)用
CREATE TRIGGER trigger_nametrigger_timetrigger_event ON tbl_nameFOR EACH ROWtrigger_stmttrigger_name:標(biāo)識觸發(fā)器名稱,用戶自行指定;
trigger_time:標(biāo)識觸發(fā)時機(jī),取值為 BEFORE 或 AFTER;
trigger_event:標(biāo)識觸發(fā)事件,取值為 INSERT、UPDATE、DELETE、LOAD DATA、REPLACE
tbl_name:標(biāo)識建立觸發(fā)器的表名,即在哪張表上建立觸發(fā)器;
trigger_stmt:觸發(fā)器程序體,可以是一句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參數(shù)詳解
LOAD DATA 語句用于將一個文件裝入到一個數(shù)據(jù)表中,相當(dāng)與一系列的 INSERT 操作。
REPLACE 語句一般來說和 INSERT 語句很像,只是在表中有 primary key 或 unique 索引時,如果插入的數(shù)據(jù)和原來 primary key 或 unique 索引一致時,會先刪除原來的數(shù)據(jù),然后增加一條新數(shù)據(jù),也就是說,一條 REPLACE 語句有時候等價于一條。INSERT 語句,有時候等價于一條 DELETE 語句加上一條 INSERT 語句。
INSERT 型觸發(fā)器:插入某一行時激活觸發(fā)器,可能通過 INSERT、LOAD DATA、REPLACE 語句觸發(fā);
UPDATE 型觸發(fā)器:更改某一行時激活觸發(fā)器,可能通過 UPDATE 語句觸發(fā);
DELETE 型觸發(fā)器:刪除某一行時激活觸發(fā)器,可能通過 DELETE、REPLACE 語句觸發(fā)。
②BEGIN … END 詳解
BEGIN[statement_list] ENDstatement_list 代表一個或多個語句的列表,列表內(nèi)的每條語句都必須用分號(;)來結(jié)尾。
注意:在mysql某些版本中,由于分號是語句結(jié)束的標(biāo)識符,遇到分號表示該段語句已經(jīng)結(jié)束,MySQL便會立即開始執(zhí)行。所以,解釋器遇到statement_list 中的分號后會報(bào)出錯誤,因?yàn)闆]有找到和 BEGIN 匹配的 END。
這時就會用到 DELIMITER 命令,它是一條命令,不需要語句結(jié)束標(biāo)識
new_delemiter 可以設(shè)為1個或多個長度的符號,默認(rèn)的是分號(;)
DELIMITER 之后的語句,以分號結(jié)束,解釋器不會有什么反應(yīng),只有遇到了,才認(rèn)為是語句結(jié)束。使用完之后,我們還應(yīng)該記得把它給修改回來。
③DECLARE變量詳解
DECLARE 用來定義一局部變量,該變量只能在 BEGIN … END 復(fù)合語句中使用,并且應(yīng)該定義在復(fù)合語句的開頭,
DECLARE var_name[,...] type [DEFAULT value] 例:declare c int;var_name 為變量名稱,同 SQL 語句一樣,變量名不區(qū)分大小寫;
type 為 MySQL 支持的任何數(shù)據(jù)類型;可以同時定義多個同類型的變量,用逗號隔開;
變量初始值為 NULL,如果需要,可以使用 DEFAULT子句提供默認(rèn)值,值可以被指定為一個表達(dá)式。
④NEW 與 OLD 詳解
NEW.columnNamecolumnName 為相應(yīng)數(shù)據(jù)表某一列名
在 INSERT 型觸發(fā)器中,NEW 用來表示將要(BEFORE)或已經(jīng)(AFTER)插入的新數(shù)據(jù);
在 UPDATE 型觸發(fā)器中,OLD 用來表示將要或已經(jīng)被修改的原數(shù)據(jù),NEW 用來表示將要或已經(jīng)修改為的新數(shù)據(jù);
在 DELETE 型觸發(fā)器中,OLD 用來表示將要或已經(jīng)被刪除的原數(shù)據(jù);
注意:OLD 是只讀的,而 NEW 則可以在觸發(fā)器中使用 SET 賦值,這樣不會再次觸發(fā)觸發(fā)器,造成循環(huán)調(diào)用(如每插入一個學(xué)生前,都在其學(xué)號前加“2013”)。
2、查看觸發(fā)器
SHOW TRIGGERS [FROM schema_name];schema_name 即 Schema 的名稱
3、刪除觸發(fā)器
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name和刪除數(shù)據(jù)庫、刪除表格一樣
4、觸發(fā)器的執(zhí)行順序
①如果 BEFORE 觸發(fā)器執(zhí)行失敗,SQL 無法正確執(zhí)行。
②SQL 執(zhí)行失敗時,AFTER 型觸發(fā)器不會觸發(fā)。
③AFTER 類型的觸發(fā)器執(zhí)行失敗,SQL 會回滾。
5、簡單實(shí)例
a創(chuàng)建表
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創(chuàng)建觸發(fā)器: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創(chuàng)建觸發(fā)器:t_afterdelete_on_tab1
作用:刪除tab1表記錄后自動將tab2表中對應(yīng)的記錄刪去
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;總結(jié)
以上是生活随笔為你收集整理的【mysql】触发器的实例详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: http://www.cnblogs.c
- 下一篇: mysql触发器预约实例_Mysql触发