觸發(fā)器
MySQL包含對觸發(fā)器的支持您市。觸發(fā)器是一種與表操作有關(guān)的數(shù)據(jù)庫對象,當(dāng)觸發(fā)器所在表上出現(xiàn)指定事件時(shí)役衡,將調(diào)用該對象茵休,即表的操作事件觸發(fā)表上的觸發(fā)器的執(zhí)行。
創(chuàng)建觸發(fā)器
在MySQL中,創(chuàng)建觸發(fā)器語法如下:
CREATE TRIGGER trigger_name //觸發(fā)器的名字自行定義
trigger_time //標(biāo)識觸發(fā)時(shí)機(jī)榕莺,取值為 BEFORE 或 AFTER俐芯;
trigger_event // 標(biāo)識觸發(fā)事件,取值為 INSERT钉鸯、UPDATE 或 DELETE吧史;
ON tbl_name//標(biāo)識建立觸發(fā)器的表名,即在哪張表上建立觸發(fā)器唠雕;
FOR EACH ROW //設(shè)置每行數(shù)據(jù)執(zhí)行時(shí)觸發(fā)
trigger_stmt//觸發(fā)器程序體贸营,可以是一句SQL語句,或者用 BEGIN 和 END 包含的多條語句岩睁。
由此可見钞脂,可以建立6種觸發(fā)器,即:BEFORE INSERT捕儒、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT萤厅、AFTER UPDATE目代、AFTER DELETE。
另外有一個(gè)限制是不能同時(shí)在一個(gè)表上建立2個(gè)相同類型的觸發(fā)器点弯,因此在一個(gè)表上最多建立6個(gè)觸發(fā)器扇调。
trigger_event 詳解
MySQL 除了對 INSERT、UPDATE蒲拉、DELETE 基本操作進(jìn)行定義外肃拜,還定義了 LOAD DATA 和 REPLACE 語句,這兩種語句也能引起上述6中類型的觸發(fā)器的觸發(fā)雌团。
LOAD DATA 語句用于將一個(gè)文件裝入到一個(gè)數(shù)據(jù)表中燃领,相當(dāng)與一系列的 INSERT 操作。
REPLACE 語句一般來說和 INSERT 語句很像锦援,只是在表中有 primary key 或 unique 索引時(shí)猛蔽,如果插入的數(shù)據(jù)和原來 primary key 或 unique 索引一致時(shí),會先刪除原來的數(shù)據(jù)灵寺,然后增加一條新數(shù)據(jù)曼库,也就是說,一條 REPLACE 語句有時(shí)候等價(jià)于一條INSERT 語句略板,有時(shí)候等價(jià)于一條 DELETE 語句加上一條 INSERT 語句毁枯。
INSERT 型觸發(fā)器:插入某一行時(shí)激活觸發(fā)器,可能通過 INSERT叮称、LOAD DATA种玛、REPLACE 語句觸發(fā)藐鹤;
UPDATE 型觸發(fā)器:更改某一行時(shí)激活觸發(fā)器,可能通過 UPDATE 語句觸發(fā)赂韵;
DELETE 型觸發(fā)器:刪除某一行時(shí)激活觸發(fā)器娱节,可能通過 DELETE、REPLACE 語句觸發(fā)祭示。
BEGIN … END 詳解
在MySQL中肄满,BEGIN … END 語句的語法為:
BEGIN
[statement_list]
END
其中,statement_list 代表一個(gè)或多個(gè)語句的列表质涛,列表內(nèi)的每條語句都必須用分號(;)來結(jié)尾稠歉。
而在MySQL中,分號是語句結(jié)束的標(biāo)識符蹂窖,遇到分號表示該段語句已經(jīng)結(jié)束轧抗,MySQL可以開始執(zhí)行了。因此瞬测,解釋器遇到statement_list 中的分號后就開始執(zhí)行横媚,然后會報(bào)出錯(cuò)誤,因?yàn)闆]有找到和 BEGIN 匹配的 END月趟。
這時(shí)就會用到 DELIMITER 命令(DELIMITER 是定界符灯蝴,分隔符的意思),它是一條命令孝宗,不需要語句結(jié)束標(biāo)識穷躁,語法為:
DELIMITER new_delemiter
new_delemiter 可以設(shè)為1個(gè)或多個(gè)長度的符號,默認(rèn)的是分號(;)因妇,我們可以把它修改為其他符號问潭,如 $:
DELIMITER $
在這之后的語句,以分號結(jié)束婚被,解釋器不會有什么反應(yīng)狡忙,只有遇到了$,才認(rèn)為是語句結(jié)束址芯。注意灾茁,使用完之后,我們還應(yīng)該記得把它給修改回來谷炸。
一個(gè)完整的創(chuàng)建觸發(fā)器示例
假設(shè)系統(tǒng)中有兩個(gè)表:
班級表 class(班級號 classID, 班內(nèi)學(xué)生數(shù) stuCount)
學(xué)生表 student(學(xué)號 stuID, 所屬班級號 classID)
要?jiǎng)?chuàng)建觸發(fā)器來使班級表中的班內(nèi)學(xué)生數(shù)隨著學(xué)生的添加自動更新北专,代碼如下:
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 復(fù)合語句中使用旬陡,并且應(yīng)該定義在復(fù)合語句的開頭拓颓,即其它語句之前,語法如下:
DECLARE var_name[,...] type [DEFAULT value]
其中:
var_name 為變量名稱描孟,同 SQL 語句一樣录粱,
變量名不區(qū)分大小寫腻格;type 為 MySQL
支持的任何數(shù)據(jù)類型画拾;可以
同時(shí)定義多個(gè)同類型的變量啥繁,用
逗號隔開;變量
初始值為
NULL青抛,如果需要旗闽,可以
使用 DEFAULT 子句提供默認(rèn)值,值可以被指定為一個(gè)表達(dá)式蜜另。
對變量賦值采用 SET 語句适室,語法為:
SET var_name = expr [,var_name = expr] ...
NEW 與 OLD 詳解
上述示例中使用了NEW關(guān)鍵字,和 MS SQL Server 中的 INSERTED 和 DELETED 類似举瑰,MySQL 中定義了 NEW 和 OLD捣辆,用來表示.
觸發(fā)器的所在表中,觸發(fā)了觸發(fā)器的那一行數(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ù)罢坝;
使用方法: NEW.columnName (columnName 為相應(yīng)數(shù)據(jù)表某一列名)
另外,OLD 是只讀的搅窿,而 NEW 則可以在觸發(fā)器中使用 SET 賦值嘁酿,這樣不會再次觸發(fā)觸發(fā)器,造成循環(huán)調(diào)用(如每插入一個(gè)學(xué)生前男应,都在其學(xué)號前加“2013”)闹司。
查看觸發(fā)器
和查看數(shù)據(jù)庫(show databases;)查看表格(show tables;)一樣,查看觸發(fā)器的語法如下:
SHOW TRIGGERS [FROM schema_name];
其中殉了,schema_name 即 Schema 的名稱开仰,在 MySQL 中 Schema 和 Database 是一樣的,也就是說薪铜,可以指定數(shù)據(jù)庫名众弓,這樣就
不必先“USE database_name;”了。
刪除觸發(fā)器
和刪除數(shù)據(jù)庫隔箍、刪除表格一樣谓娃,刪除觸發(fā)器的語法如下:
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
觸發(fā)器的執(zhí)行順序
我們建立的數(shù)據(jù)庫一般都是 InnoDB 數(shù)據(jù)庫,其上建立的表是事務(wù)性表蜒滩,也就是事務(wù)安全的滨达。這時(shí)奶稠,若SQL語句或觸發(fā)器執(zhí)行失敗,MySQL 會回滾事務(wù)捡遍,有:
①如果 BEFORE 觸發(fā)器執(zhí)行失敗锌订,SQL 無法正確執(zhí)行。
②SQL 執(zhí)行失敗時(shí)画株,AFTER 型觸發(fā)器不會觸發(fā)辆飘。
③AFTER 類型的觸發(fā)器執(zhí)行失敗,SQL 會回滾谓传。
Navicat for MySQL上Mysql觸發(fā)器的使用
Navicat for MySQL:是一套管理和開發(fā)MySQL或MariaDB可視化桌面軟件蜈项。
MySql使用觸發(fā)器注意事項(xiàng):
觸發(fā)器使用的表需要支持事務(wù)(就是InnoDB)。
創(chuàng)建觸發(fā)器的表续挟,不能再sql語句(就是BEGIN...END)中再次操作該張表紧卒。
在Navicat for Mysql上使用觸發(fā)器步驟:
1.選中需要添加觸發(fā)器的表(右鍵/設(shè)計(jì)表)
給test表創(chuàng)建觸發(fā)器(創(chuàng)建成功,記得保存觸發(fā)器)
這里會在test插入數(shù)據(jù)的時(shí)候執(zhí)行定義中語句诗祸,并刪除member表的第一行數(shù)據(jù)跑芳。 更多觸發(fā)器的使用,參看MySql觸發(fā)器的使用(使用原生的sql命令創(chuàng)建觸發(fā)器)