MySQL觸發器應用詳解。本站提示廣大學習愛好者:(MySQL觸發器應用詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL觸發器應用詳解正文
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的觸發器的應用有所懂得了呢,若有疑問,就給我留言吧,年夜家配合提高。