大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專(zhuān)注Java教育14年 全國(guó)咨詢(xún)/投訴熱線(xiàn):400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 MySQL觸發(fā)器的學(xué)習(xí)

MySQL觸發(fā)器的學(xué)習(xí)

更新時(shí)間:2021-07-15 16:20:26 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1155次

MySQL包含對(duì)觸發(fā)器的支持。觸發(fā)器是一種與表操作有關(guān)的數(shù)據(jù)庫(kù)對(duì)象,當(dāng)觸發(fā)器所在表上出現(xiàn)指定事件時(shí),將調(diào)用該對(duì)象,即表的操作事件觸發(fā)表上的觸發(fā)器的執(zhí)行。

創(chuàng)建觸發(fā)器

在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ā)器名稱(chēng),用戶(hù)自行指定;

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è)相同類(lèi)型的觸發(fā)器,因此在一個(gè)表上最多建立6個(gè)觸發(fā)器。

trigger_event詳解

MySQL除了對(duì)INSERT、UPDATE、DELETE基本操作進(jìn)行定義外,還定義了LOAD DATA和REPLACE語(yǔ)句,這兩種語(yǔ)句也能引起上述6中類(lèi)型的觸發(fā)器的觸發(fā)。

LOAD DATA語(yǔ)句用于將一個(gè)文件裝入到一個(gè)數(shù)據(jù)表中,相當(dāng)與一系列的INSERT操作。

REPLACE語(yǔ)句一般來(lái)說(shuō)和INSERT語(yǔ)句很像,只是在表中有primary key或unique索引時(shí),如果插入的數(shù)據(jù)和原來(lái)primary key或unique索引一致時(shí),會(huì)先刪除原來(lái)的數(shù)據(jù),然后增加一條新數(shù)據(jù),也就是說(shuō),一條REPLACE語(yǔ)句有時(shí)候等價(jià)于一條。

INSERT語(yǔ)句,有時(shí)候等價(jià)于一條DELETE語(yǔ)句加上一條INSERT語(yǔ)句。

INSERT型觸發(fā)器:插入某一行時(shí)激活觸發(fā)器,可能通過(guò)INSERT、LOAD DATA、REPLACE語(yǔ)句觸發(fā);

UPDATE型觸發(fā)器:更改某一行時(shí)激活觸發(fā)器,可能通過(guò)UPDATE語(yǔ)句觸發(fā);

DELETE型觸發(fā)器:刪除某一行時(shí)激活觸發(fā)器,可能通過(guò)DELETE、REPLACE語(yǔ)句觸發(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可以開(kāi)始執(zhí)行了。因此,解釋器遇到statement_list中的分號(hào)后就開(kāi)始執(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è)為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;
set c = (select stuCount from class where classID=new.classID);
update class set stuCount = c + 1 where classID = new.classID;
end$
DELIMITER ;

變量詳解

MySQL中使用DECLARE來(lái)定義一局部變量,該變量只能在BEGIN…END復(fù)合語(yǔ)句中使用,并且應(yīng)該定義在復(fù)合語(yǔ)句的開(kāi)頭,

即其它語(yǔ)句之前,語(yǔ)法如下:

DECLARE var_name[,...] type [DEFAULT value]

其中:

var_name為變量名稱(chēng),同SQL語(yǔ)句一樣,變量名不區(qū)分大小寫(xiě);type為MySQL支持的任何數(shù)據(jù)類(lèi)型;可以同時(shí)定義多個(gè)同類(lèi)型的變量,用逗號(hào)隔開(kāi);變量初始值為NULL,如果需要,可以使用DEFAULT子句提供默認(rèn)值,值可以被指定為一個(gè)表達(dá)式。

對(duì)變量賦值采用SET語(yǔ)句,語(yǔ)法為:

SET var_name = expr [,var_name = expr] ...

NEW與OLD詳解

上述示例中使用了NEW關(guān)鍵字,和MS SQL Server中的INSERTED和DELETED類(lèi)似,MySQL中定義了NEW和OLD,用來(lái)表示

觸發(fā)器的所在表中,觸發(fā)了觸發(fā)器的那一行數(shù)據(jù)。

具體地:

在INSERT型觸發(fā)器中,NEW用來(lái)表示將要(BEFORE)或已經(jīng)(AFTER)插入的新數(shù)據(jù);

在UPDATE型觸發(fā)器中,OLD用來(lái)表示將要或已經(jīng)被修改的原數(shù)據(jù),NEW用來(lái)表示將要或已經(jīng)修改為的新數(shù)據(jù);

在DELETE型觸發(fā)器中,OLD用來(lái)表示將要或已經(jīng)被刪除的原數(shù)據(jù);

使用方法:NEW.columnName(columnName為相應(yīng)數(shù)據(jù)表某一列名)

另外,OLD是只讀的,而NEW則可以在觸發(fā)器中使用SET賦值,這樣不會(huì)再次觸發(fā)觸發(fā)器,造成循環(huán)調(diào)用(如每插入一個(gè)學(xué)生前,都在其學(xué)號(hào)前加“2013”)。

查看觸發(fā)器

和查看數(shù)據(jù)庫(kù)(show databases;)查看表格(show tables;)一樣,查看觸發(fā)器的語(yǔ)法如下:

SHOW TRIGGERS [FROM schema_name];

其中,schema_name 即 Schema 的名稱(chēng),在 MySQL 中 Schema 和 Database 是一樣的,也就是說(shuō),可以指定數(shù)據(jù)庫(kù)名,這樣就

不必先“USE database_name;”了。

刪除觸發(fā)器

和刪除數(shù)據(jù)庫(kù)、刪除表格一樣,刪除觸發(fā)器的語(yǔ)法如下:

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類(lèi)型的觸發(fā)器執(zhí)行失敗,SQL會(huì)回滾。

以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"MySQL觸發(fā)器的學(xué)習(xí)",希望對(duì)大家有幫助,想了解更多可查看MySQL教程。動(dòng)力節(jié)點(diǎn)在線(xiàn)學(xué)習(xí)教程,針對(duì)沒(méi)有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門(mén)到精通,主要介紹了一些Java基礎(chǔ)的核心知識(shí),讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。 

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-10-10 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 国产在线成人精品 | 亚洲天天做日日做天天欢毛片 | 色中文字幕在线 | 国产91在线看 | 欧美日韩91 | 九九精品视频在线观看九九 | 天天视频国产免费入口 | 视频一区免费 | 九九视频免费精品视频免费 | 国产精品第一页爽爽影院 | 国产亚洲自在精品久久 | 国产精品久久久久久福利 | 番茄视频在线观看黄版本免费 | 九月婷婷天天澡天天添天天爽 | 26uuu另类欧美亚洲曰本 | 一级女毛片 | 免费黄色福利 | 国产成+人+亚洲+欧美综合 | 日日插夜夜操 | 欧美专区亚洲专区 | 国产欧美日韩精品a在线观看 | 国产成综合 | 国产在线精品网址你懂的 | 久久99精品久久久久久国产人妖 | 欧美激情在线视频播放 | 亚洲欧美韩日 | 欧美一级毛片免费大片 | 狠狠色噜噜狠狠狠97影音先锋 | 尤物国产在线精品福利一区 | 国产亚洲精品一品区99热 | 天天操天天摸天天舔 | 成人在线综合 | 欧美一区二 | 国产精品亚洲专一区二区三区 | 国产一级爱c片免费播放 | 老司机免费福利视频无毒午夜 | 亚洲女人天堂a在线播放 | 久久精品国产一区二区三区不卡 | 五月月色开心婷婷久久合 | a免费国产一级特黄aa大 | 国内精自品线一区91 |