【mysql】触发器的实例详解
1、創建觸發器
a基本語法應用
CREATE TRIGGER trigger_nametrigger_timetrigger_event ON tbl_nameFOR EACH ROWtrigger_stmttrigger_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] ENDstatement_list 代表一個或多個語句的列表,列表內的每條語句都必須用分號(;)來結尾。
注意:在mysql某些版本中,由于分號是語句結束的標識符,遇到分號表示該段語句已經結束,MySQL便會立即開始執行。所以,解釋器遇到statement_list 中的分號后會報出錯誤,因為沒有找到和 BEGIN 匹配的 END。
這時就會用到 DELIMITER 命令,它是一條命令,不需要語句結束標識
new_delemiter 可以設為1個或多個長度的符號,默認的是分號(;)
DELIMITER 之后的語句,以分號結束,解釋器不會有什么反應,只有遇到了,才認為是語句結束。使用完之后,我們還應該記得把它給修改回來。
③DECLARE變量詳解
DECLARE 用來定義一局部變量,該變量只能在 BEGIN … END 復合語句中使用,并且應該定義在復合語句的開頭,
DECLARE var_name[,...] type [DEFAULT value] 例:declare c int;var_name 為變量名稱,同 SQL 語句一樣,變量名不區分大小寫;
type 為 MySQL 支持的任何數據類型;可以同時定義多個同類型的變量,用逗號隔開;
變量初始值為 NULL,如果需要,可以使用 DEFAULT子句提供默認值,值可以被指定為一個表達式。
④NEW 與 OLD 詳解
NEW.columnNamecolumnName 為相應數據表某一列名
在 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】触发器的实例详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: http://www.cnblogs.c
- 下一篇: linux cmake编译源码,linu