觸發(fā)器的使用

本篇文章采用的數(shù)據(jù)是把一個(gè)數(shù)據(jù)表中的數(shù)據(jù)導(dǎo)入另一個(gè)表里面的數(shù)據(jù)汇恤,此處不再展示。


先做一個(gè)實(shí)例再解釋瘤运。實(shí)現(xiàn)test1只要執(zhí)行delete刪除,就在觸發(fā)一個(gè)test1觸發(fā)器属桦,test3插入一條語(yǔ)句

// 下面的語(yǔ)句其實(shí)部分要分行菱阵,分行只是為了可讀性
create trigger test1    //test1觸發(fā)器名字
after                   // 觸發(fā)的時(shí)間 只有before和after
delete on test1        //delete還有insert update,共三種蚊逢。test1指的是test1數(shù)據(jù)表
for each row          //此處是固定寫法层扶,意思是每次制定delete,就會(huì)出發(fā)下面的語(yǔ)句--刪除多少條烙荷,就會(huì)執(zhí)行下面的語(yǔ)句多少條
insert into test3 values (null,1,1,1);  //這是觸發(fā)執(zhí)行的sql語(yǔ)句镜会,可以隨便寫
test3原本5條數(shù)據(jù)
test1刪除6條后,test3增加6條
  • 觸發(fā)器語(yǔ)法
在MySQL中终抽,創(chuàng)建觸發(fā)器語(yǔ)法如下:
CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt

其中:
trigger_name:標(biāo)識(shí)觸發(fā)器名稱戳表,用戶自行指定;
trigger_time:標(biāo)識(shí)觸發(fā)時(shí)機(jī)昼伴,取值為 BEFORE 或 AFTER匾旭;
trigger_event:標(biāo)識(shí)觸發(fā)事件,取值為 INSERT圃郊、UPDATE 或 DELETE价涝;
tbl_name:標(biāo)識(shí)建立觸發(fā)器的表名,即在哪張表上建立觸發(fā)器描沟;
trigger_stmt:觸發(fā)器程序體飒泻,可以是一句SQL語(yǔ)句,或者用 BEGIN 和 END 包含的多條語(yǔ)句吏廉。

由此可見(jiàn)泞遗,可以建立6種觸發(fā)器,即:BEFORE INSERT席覆、BEFORE UPDATE史辙、BEFORE DELETE、AFTER INSERT、AFTER UPDATE聊倔、AFTER DELETE晦毙。

另外有一個(gè)限制是不能同時(shí)在一個(gè)表上建立2個(gè)相同類型的觸發(fā)器,因此在一個(gè)表上最多建立6個(gè)觸發(fā)器耙蔑。

BEGIN … END 詳解

在MySQL中见妒,BEGIN … END 語(yǔ)句的語(yǔ)法為:

BEGIN
[statement_list]
END

其中,statement_list 代表一個(gè)或多個(gè)語(yǔ)句的列表甸陌,列表內(nèi)的每條語(yǔ)句都必須用分號(hào)(;)來(lái)結(jié)尾须揣。
而在MySQL中,分號(hào)是語(yǔ)句結(jié)束的標(biāo)識(shí)符钱豁,遇到分號(hào)表示該段語(yǔ)句已經(jīng)結(jié)束耻卡,MySQL可以開始執(zhí)行了。
因此牲尺,解釋器遇到statement_list 中的分號(hào)后就開始執(zhí)行卵酪,然后會(huì)報(bào)出錯(cuò)誤,因?yàn)闆](méi)有找到和 BEGIN 匹配的 END谤碳。

這時(shí)就會(huì)用到 DELIMITER 命令(DELIMITER 是定界符溃卡,分隔符的意思),它是一條命令蜒简,不需要語(yǔ)句結(jié)束標(biāo)識(shí)塑煎,語(yǔ)法為:
DELIMITER new_delemiter --new_delemiter其實(shí)是一個(gè)新的符號(hào)
new_delemiter 可以設(shè)為1個(gè)或多個(gè)長(zhǎng)度的符號(hào),默認(rèn)的是分號(hào)(;)臭蚁,我們可以把它修改為其他符號(hào),如$:
DELIMITER $
在這之后的語(yǔ)句讯赏,以分號(hào)結(jié)束垮兑,解釋器不會(huì)有什么反應(yīng),只有遇到了$漱挎,才認(rèn)為是語(yǔ)句結(jié)束系枪。注意,使用完之后磕谅,我們還應(yīng)該記得把它給修改回來(lái)私爷。

一個(gè)完整的創(chuàng)建觸發(fā)器示例

假設(shè)系統(tǒng)中有兩個(gè)表:班級(jí)表 class(班級(jí)號(hào) classID, 班內(nèi)學(xué)生數(shù) stuCount)學(xué)生表 student(學(xué)號(hào) stuID, 所屬班級(jí)號(hào) classID)要?jiǎng)?chuàng)建觸發(fā)器來(lái)使班級(jí)表中的班內(nèi)學(xué)生數(shù)隨著學(xué)生的添加自動(dòng)更新,代碼如下:

DELIMITER $
create trigger tri_stuInsert after insert
on student for each row
begin
declare c int;   //1.定義變量
set c = (select stuCount from class where classID=new.classID); //2.給變量賦值
update class set stuCount = c + 1 where classID = new.classID;
end$
DELIMITER ;
  • 變量詳解

MySQL 中使用 declare 來(lái)定義一局部變量膊夹,該變量只能在BEGIN … END 復(fù)合語(yǔ)句中使用衬浑,并且應(yīng)該定義在復(fù)合語(yǔ)句的開頭,
即其它語(yǔ)句之前放刨,

  • 定義變量語(yǔ)法如下:
declare var_name[,...] type [DEFAULT value]

其中:
var_name為變量名稱工秩,同 SQL 語(yǔ)句一樣,變量名不區(qū)分大小寫;type 為 MySQL 支持的任何數(shù)據(jù)類型助币;可以同時(shí)定義多個(gè)同類型的變量浪听,用逗號(hào)隔開;變量初始值為 NULL眉菱,如果需要迹栓,可以使用 DEFAULT 子句提供默認(rèn)值,值可以被指定為一個(gè)表達(dá)式俭缓。

  • 對(duì)變量賦值采用 SET 語(yǔ)句克伊,語(yǔ)法為:
SET var_name = expr [,var_name = expr] ...
  • 查看和刪除觸發(fā)器
    跟查看數(shù)據(jù)庫(kù),數(shù)據(jù)表一樣
show triggers;
drop trigger trigger_name;

// 我看他們資料這么寫
SHOW TRIGGERS [FROM schema_name]; //我測(cè)試后面添加數(shù)據(jù)庫(kù)名字刪除失敗
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

  • 觸發(fā)器的執(zhí)行順序

我們建立的數(shù)據(jù)庫(kù)一般都是 InnoDB 數(shù)據(jù)庫(kù)尔崔,其上建立的表是事務(wù)性表答毫,也就是事務(wù)安全的。這時(shí)季春,若SQL語(yǔ)句或觸發(fā)器執(zhí)行失敗洗搂,MySQL 會(huì)回滾事務(wù),有:
①如果 BEFORE 觸發(fā)器執(zhí)行失敗载弄,SQL 無(wú)法正確執(zhí)行耘拇。
②SQL 執(zhí)行失敗時(shí),AFTER 型觸發(fā)器不會(huì)觸發(fā)宇攻。
③AFTER 類型的觸發(fā)器執(zhí)行失敗惫叛,SQL 會(huì)回滾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逞刷,一起剝皮案震驚了整個(gè)濱河市嘉涌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夸浅,老刑警劉巖仑最,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異帆喇,居然都是意外死亡警医,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門坯钦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)预皇,“玉大人,你說(shuō)我怎么就攤上這事婉刀∫魑拢” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵路星,是天一觀的道長(zhǎng)溯街。 經(jīng)常有香客問(wèn)我诱桂,道長(zhǎng),這世上最難降的妖魔是什么呈昔? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任挥等,我火速辦了婚禮,結(jié)果婚禮上堤尾,老公的妹妹穿的比我還像新娘肝劲。我一直安慰自己,他們只是感情好郭宝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布辞槐。 她就那樣靜靜地躺著,像睡著了一般粘室。 火紅的嫁衣襯著肌膚如雪榄檬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天衔统,我揣著相機(jī)與錄音鹿榜,去河邊找鬼。 笑死锦爵,一個(gè)胖子當(dāng)著我的面吹牛舱殿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播险掀,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沪袭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了樟氢?” 一聲冷哼從身側(cè)響起冈绊,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎埠啃,沒(méi)想到半個(gè)月后焚碌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霸妹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了知押。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叹螟。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖台盯,靈堂內(nèi)的尸體忽然破棺而出罢绽,到底是詐尸還是另有隱情,我是刑警寧澤静盅,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布良价,位于F島的核電站寝殴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏明垢。R本人自食惡果不足惜蚣常,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痊银。 院中可真熱鬧抵蚊,春花似錦、人聲如沸溯革。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)致稀。三九已至冈闭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抖单,已是汗流浹背萎攒。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留臭猜,地道東北人躺酒。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蔑歌,于是被迫代替她去往敵國(guó)和親羹应。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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