Mysql中的觸發(fā)器

觸發(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ā)器)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贬媒,一起剝皮案震驚了整個(gè)濱河市聋亡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌际乘,老刑警劉巖坡倔,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脖含,居然都是意外死亡罪塔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門养葵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來征堪,“玉大人,你說我怎么就攤上這事关拒〉柩粒” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵着绊,是天一觀的道長谐算。 經(jīng)常有香客問我,道長归露,這世上最難降的妖魔是什么洲脂? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮剧包,結(jié)果婚禮上恐锦,老公的妹妹穿的比我還像新娘往果。我一直安慰自己,他們只是感情好一铅,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布陕贮。 她就那樣靜靜地躺著,像睡著了一般馅闽。 火紅的嫁衣襯著肌膚如雪飘蚯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天福也,我揣著相機(jī)與錄音,去河邊找鬼攀圈。 笑死暴凑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赘来。 我是一名探鬼主播现喳,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼犬辰!你這毒婦竟也來了嗦篱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤幌缝,失蹤者是張志新(化名)和其女友劉穎灸促,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涵卵,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浴栽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轿偎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片典鸡。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坏晦,靈堂內(nèi)的尸體忽然破棺而出萝玷,到底是詐尸還是另有隱情,我是刑警寧澤昆婿,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布球碉,位于F島的核電站,受9級特大地震影響挖诸,放射性物質(zhì)發(fā)生泄漏汁尺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一多律、第九天 我趴在偏房一處隱蔽的房頂上張望痴突。 院中可真熱鬧搂蜓,春花似錦、人聲如沸辽装。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拾积。三九已至殉挽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拓巧,已是汗流浹背斯碌。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肛度,地道東北人傻唾。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像承耿,于是被迫代替她去往敵國和親冠骄。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 概述 觸發(fā)器加袋,顧名思義就是當(dāng)某個(gè)事情(事件)發(fā)生時(shí)候凛辣,執(zhí)行某一段程序。觸發(fā)器有四大要素:監(jiān)視地點(diǎn)(table_na...
    林灣村龍貓閱讀 1,059評論 0 3
  • MySQL包含對觸發(fā)器的支持职烧。觸發(fā)器是一種與表操作有關(guān)的數(shù)據(jù)庫對象扁誓,當(dāng)觸發(fā)器所在表上出現(xiàn)指定事件時(shí),將調(diào)用該對象阳堕,...
    金星show閱讀 821評論 0 3
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,791評論 0 11
  • .數(shù)據(jù)庫 數(shù)據(jù)庫的發(fā)展: 文件系統(tǒng)(使用磁盤文件來存儲數(shù)據(jù))=>第一代數(shù)據(jù)庫(出現(xiàn)了網(wǎng)狀模型,層次模型的數(shù)據(jù)庫)=...
    小Q逛逛閱讀 957評論 0 2
  • 2017/9/21親子陪伴成長記錄第62天 這些日子的天氣真是好跋理,藍(lán)藍(lán)的天空白白的云朵,和暖的陽光照在我燦爛的笑臉...
    博古茹今閱讀 355評論 0 0