日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

MySQL数据库:触发器Trigger

發(fā)布時(shí)間:2024/9/30 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL数据库:触发器Trigger 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

一、什么是觸發(fā)器:

觸發(fā)器是與表有關(guān)的數(shù)據(jù)庫(kù)對(duì)象,當(dāng)觸發(fā)器所在表上出現(xiàn)指定事件并滿足定義條件的時(shí)候,將執(zhí)行觸發(fā)器中定義的語(yǔ)句集合。觸發(fā)器的這種特性可以協(xié)助應(yīng)用在數(shù)據(jù)庫(kù)端確保數(shù)據(jù)的完整性。觸發(fā)器是一個(gè)特殊的存儲(chǔ)過(guò)程,不同的是存儲(chǔ)過(guò)程要用call來(lái)調(diào)用,而觸發(fā)器不需要使用call,也不需要手工調(diào)用,它在插入,刪除或修改特定表中的數(shù)據(jù)時(shí)觸發(fā)執(zhí)行,它比數(shù)據(jù)庫(kù)本身標(biāo)準(zhǔn)的功能有更精細(xì)和更復(fù)雜的數(shù)據(jù)控制能力。

?

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

1、語(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ā)器。

2、Trigger_event?詳解:

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

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

(2)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à)于一條。

(3)UPDATE?語(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ā)。

3、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 命令,它是一條命令,不需要語(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)。

4、觸發(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 ;

5、NEW?與 OLD 詳解:

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

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

(3)在 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ā)器其他操作:

1、查看觸發(fā)器信息:

查看觸發(fā)器是指數(shù)據(jù)庫(kù)中已存在的觸發(fā)器的定義、狀態(tài)、語(yǔ)法信息等。

SHOW TRIGGERS [FROM schema_name];? ? --第一種

其中,schema_name 可以指定數(shù)據(jù)庫(kù)名。

在TRIGGERS 表中查看觸發(fā)器信息:

SELECT * FROM `information_schema`.`TRIGGERS` WHERE `TRIGGER_NAME`='xxxx';? ? ?--第二種

2、刪除觸發(fā)器

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name;

?

四、觸發(fā)器相關(guān):

1、觸發(fā)器的執(zhí)行順序與異常機(jī)制:

MySQL的觸發(fā)器是按照BEFORE觸發(fā)器、行操作、AFTER觸發(fā)器的順序執(zhí)行的,其中任何一步發(fā)生錯(cuò)誤都不會(huì)繼續(xù)執(zhí)行剩下的操作。如果是對(duì)事務(wù)表進(jìn)行的操作,那么會(huì)整個(gè)作為一個(gè)事務(wù)被回滾,但是如果是對(duì)非事務(wù)表進(jìn)行的操作,那么已經(jīng)更新的記錄將無(wú)法回滾。

(1)如果 BEFORE 觸發(fā)器執(zhí)行失敗,SQL 無(wú)法正確執(zhí)行;

(2)SQL 執(zhí)行失敗時(shí),AFTER 型觸發(fā)器不會(huì)觸發(fā);

(3)AFTER 類型的觸發(fā)器執(zhí)行失敗,SQL 會(huì)回滾。

2、觸發(fā)器的使用限制:

(1)觸發(fā)器只能創(chuàng)建在永久表上,不能對(duì)臨時(shí)表創(chuàng)建觸發(fā)器;

(2)觸發(fā)程序不能調(diào)用將數(shù)據(jù)返回給客戶端的存儲(chǔ)程序,也不能使用CALL語(yǔ)句的動(dòng)態(tài)SQL語(yǔ)句,但是允許存儲(chǔ)過(guò)程或者函數(shù)通過(guò)OUT或者INOUT類型的參數(shù)將數(shù)據(jù)返回觸發(fā)器是可以的,但是不能調(diào)用直接返回?cái)?shù)據(jù)的過(guò)程。

(3)觸發(fā)器中不能使用開(kāi)啟或結(jié)束事務(wù)的語(yǔ)句段,比如,開(kāi)始事務(wù)(START TRANSACTION)、提交事務(wù)(COMMIT)或是回滾事務(wù)(ROLLBACK),但是回滾到一個(gè)保存點(diǎn)(SAVEPOINT是允許的,因?yàn)榛貪L到保存點(diǎn)不會(huì)結(jié)束事務(wù));

(4)外鍵不會(huì)激活觸發(fā)器;

(5)當(dāng)使用基于行的復(fù)制時(shí),從表上的觸發(fā)器不會(huì)因操作主表中的數(shù)據(jù)而激活。當(dāng)使用基于語(yǔ)句的復(fù)制時(shí),從表上的觸發(fā)器會(huì)被激活。

(6)觸發(fā)器中不允許返回值,因此觸發(fā)器中不能有返回語(yǔ)句,如果要立即停止一個(gè)觸發(fā)器,應(yīng)該使用LEAVE語(yǔ)句;

3、觸發(fā)器的作用:

(1)安全性。可以基于數(shù)據(jù)庫(kù)的值使用戶具有操作數(shù)據(jù)庫(kù)的某種權(quán)利。

--可以基于時(shí)間限制用戶的操作,例如不允許下班后和節(jié)假日修改數(shù)據(jù)庫(kù)數(shù)據(jù)。

--可以基于數(shù)據(jù)庫(kù)中的數(shù)據(jù)限制用戶的操作,例如不允許股票的價(jià)格的升幅一次超過(guò)10%。

(2)審計(jì)。可以跟蹤用戶對(duì)數(shù)據(jù)庫(kù)的操作。???

--審計(jì)用戶操作數(shù)據(jù)庫(kù)的語(yǔ)句。

--把用戶對(duì)數(shù)據(jù)庫(kù)的更新寫(xiě)入審計(jì)表。

(3)實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)完整性規(guī)則:

--實(shí)現(xiàn)非標(biāo)準(zhǔn)的數(shù)據(jù)完整性檢查和約束。觸發(fā)器可產(chǎn)生比規(guī)則更為復(fù)雜的限制。與規(guī)則不同,觸發(fā)器可以引用列或數(shù)據(jù)庫(kù)對(duì)象。例如,觸發(fā)器可回退任何企圖吃進(jìn)超過(guò)自己保證金的期貨。

--提供可變的缺省值。

(4)實(shí)現(xiàn)復(fù)雜的非標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)相關(guān)完整性規(guī)則。觸發(fā)器可以對(duì)數(shù)據(jù)庫(kù)中相關(guān)的表進(jìn)行連環(huán)更新。例如,在auths表author_code列上的刪除觸發(fā)器可導(dǎo)致相應(yīng)刪除在其它表中的與之匹配的行。

--修改或刪除時(shí)級(jí)聯(lián)修改或刪除其它表中的與之匹配的行。

--在修改或刪除時(shí)把其它表中的與之匹配的行設(shè)成NULL值。

--在修改或刪除時(shí)把其它表中的與之匹配的行級(jí)聯(lián)設(shè)成缺省值。

--觸發(fā)器能夠拒絕或回退那些破壞相關(guān)完整性的變化,取消試圖進(jìn)行數(shù)據(jù)更新的事務(wù)。當(dāng)插入一個(gè)與其主健不匹配的外部鍵時(shí),這種觸發(fā)器會(huì)起作用。例如,可以在books.author_code?列上生成一個(gè)插入觸發(fā)器,如果新值與auths.author_code列中的某值不匹配時(shí),插入被回退。

(5)同步實(shí)時(shí)地復(fù)制表中的數(shù)據(jù)。

(6)自動(dòng)計(jì)算數(shù)據(jù)值,如果數(shù)據(jù)的值達(dá)到了一定的要求,則進(jìn)行特定的處理。例如,如果公司的帳號(hào)上的資金低于5萬(wàn)元?jiǎng)t立即給財(cái)務(wù)人員發(fā)送警告數(shù)據(jù)。

?

?

相關(guān)博客:https://www.cnblogs.com/duodushu/p/5446384.html

與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的MySQL数据库:触发器Trigger的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。