中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

MySQL觸發(fā)器怎么創(chuàng)建和使用

這篇文章主要介紹“MySQL觸發(fā)器怎么創(chuàng)建和使用”,在日常操作中,相信很多人在MySQL觸發(fā)器怎么創(chuàng)建和使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL觸發(fā)器怎么創(chuàng)建和使用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)建站專注于鼓樓網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供鼓樓營銷型網(wǎng)站建設(shè),鼓樓網(wǎng)站制作、鼓樓網(wǎng)頁設(shè)計、鼓樓網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造鼓樓網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鼓樓網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

在實際開發(fā)中,我們經(jīng)常會遇到這樣的情況:有 2 個或者多個相互關(guān)聯(lián)的表,如 商品信息 和 庫存信息 分 別存放在 2 個不同的數(shù)據(jù)表中,我們在添加一條新商品記錄的時候,為了保證數(shù)據(jù)的完整性,必須同時 在庫存表中添加一條庫存記錄。 這樣一來,我們就必須把這兩個關(guān)聯(lián)的操作步驟寫到程序里面,而且要用 事務(wù) 包裹起來,確保這兩個操 作成為一個 原子操作 ,要么全部執(zhí)行,要么全部不執(zhí)行。

要是遇到特殊情況,可能還需要對數(shù)據(jù)進行手 動維護,這樣就很 容易忘記其中的一步 ,導(dǎo)致數(shù)據(jù)缺失。 這個時候,咱們可以使用觸發(fā)器。你可以創(chuàng)建一個觸發(fā)器,讓商品信息數(shù)據(jù)的插入操作自動觸發(fā)庫存數(shù) 據(jù)的插入操作。這樣一來,就不用擔(dān)心因為忘記添加庫存數(shù)據(jù)而導(dǎo)致的數(shù)據(jù)缺失了。

觸發(fā)器概述

MySQL從 5 . 0 . 2 版本開始支持觸發(fā)器。 MySQL的觸發(fā)器和存儲過程一樣,都是嵌入到MySQL服務(wù)器的一 段程序。 觸發(fā)器是由 事件來觸發(fā) 某個操作,這些事件包括 INSERT 、 UPDATE 、 DELETE 事件。

所謂事件就是指 用戶的動作或者觸發(fā)某項行為。如果定義了觸發(fā)程序,當(dāng)數(shù)據(jù)庫執(zhí)行這些語句時候,就相當(dāng)于事件發(fā)生 了,就會 自動 激發(fā)觸發(fā)器執(zhí)行相應(yīng)的操作。 當(dāng)對數(shù)據(jù)表中的數(shù)據(jù)執(zhí)行插入、更新和刪除操作,需要自動執(zhí)行一些數(shù)據(jù)庫邏輯時,可以使用觸發(fā)器來 實現(xiàn)。

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

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

CREATE TRIGGER 觸發(fā)器名稱 
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名 
FOR EACH ROW 
觸發(fā)器執(zhí)行的語句塊;

說明:

表名 :表示觸發(fā)器監(jiān)控的對象。

BEFORE | AFTER :表示觸發(fā)的時間。 BEFORE 表示在事件之前觸發(fā); AFTER 表示在事件之后觸發(fā)。

INSERT | UPDATE | DELETE :表示觸發(fā)的事件。

INSERT 表示插入記錄時觸發(fā);

UPDATE 表示更新記錄時觸發(fā);

DELETE 表示刪除記錄時觸發(fā)。

代碼舉例1

創(chuàng)建倆張表

CREATE TABLE test_trigge r (
id INT PRIMARY KEY AUTO_INCREMENT ,
t_note VARCHAR ( 30 )
) ;
CREATE TABLE test_trigger_log (
id INT PRIMARY KEY AUTO_INCREMENT ,
t_log VARCHAR ( 30 )
) ;

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

DELIMITER / /
CREATE TRIGGER befo_re_insert
BEFORE INSERT ON test_trigger 
FOR EACH ROW
BEGIN
 INSERT INTO test_trigger_log ( t_log )
 VALUES ( ' befo re_inse rt ' ) ;
END / /
DELIMITER ;

向test_trigger數(shù)據(jù)表中插入數(shù)據(jù)

INSERT INTO test_trigger (t_note) VALUES ('測試 BEFORE INSERT 觸發(fā)器');

MySQL觸發(fā)器怎么創(chuàng)建和使用

查看test_trigger_log數(shù)據(jù)表中的數(shù)據(jù)

SELECT * FROM test_trigger_log

MySQL觸發(fā)器怎么創(chuàng)建和使用

代碼舉例2

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

DELIMITER / /
CREATE TRIGGER after_insert
AFTER INSERT ON test_trigger
FOR EACH ROW
BEGIN
 INSERT INTO test_trigger_log ( t_log )
 VALUES ( ' after_insert ' ) ;
END / /
DELIMITER ;

向test_trigger數(shù)據(jù)表中插入數(shù)據(jù)。

INSERT INTO test_trigger (t_note) VALUES ('測試 AFTER INSERT 觸發(fā)器');

查看test_trigger_log數(shù)據(jù)表中的數(shù)據(jù)

SELECT * FROM test_trigger_log

MySQL觸發(fā)器怎么創(chuàng)建和使用

代碼舉例3

定義觸發(fā)器“salary_check_trigger”,基于員工表“employees”的INSERT事件,在INSERT之前檢查將要添加的新員工薪資是否大于他領(lǐng)導(dǎo)的薪資,如果大于領(lǐng)導(dǎo)薪資,則報sqlstate_value為'HY000'的錯誤,從而使得添加失敗。

DELIMITER //
CREATE TRIGGER salary_check_trigger
BEFORE INSERT ON employees FOR EACH ROW
BEGIN
DECLARE mgrsalary DOUBLE;
SELECT salary INTO mgrsalary FROM employees WHERE employee_id = NEW.manager_id;
IF NEW.salary > mgrsalary THEN
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '薪資高于領(lǐng)導(dǎo)薪資錯誤';
END IF;
END //
DELIMITER ;

上面觸發(fā)器聲明過程中的NEW關(guān)鍵字代表INSERT添加語句的新記錄。

查看刪除觸發(fā)器

方式1:查看當(dāng)前數(shù)據(jù)庫的所有觸發(fā)器的定義

SHOW TRIGGERS

方式2:查看當(dāng)前數(shù)據(jù)庫中某個觸發(fā)器的定義方式

SHOW CREATE TRIGGER 觸發(fā)器名

方式3:從系統(tǒng)庫information_schema的TRIGGERS表中查詢“salary_check_trigger”觸發(fā)器的信息。

SELECT * FROM information_schema.TRIGGERS;

刪除觸發(fā)器

DROP TRIGGER IF EXISTS 觸發(fā)器名稱

觸發(fā)器的優(yōu)點

1、觸發(fā)器可以確保數(shù)據(jù)的完整性。

假設(shè)我們用 進貨單頭表 (demo.importhead)來保存進貨單的總體信息,包括進貨單編號、供貨商編號、倉庫編號、總計進貨數(shù)量、總計進貨金額和驗收日期。

MySQL觸發(fā)器怎么創(chuàng)建和使用

用 進貨單明細表 (demo.importdetails)來保存進貨商品的明細,包括進貨單編號、商品編號、進貨數(shù)

MySQL觸發(fā)器怎么創(chuàng)建和使用

量、進貨價格和進貨金額額就不等于進貨單明細表中數(shù)量合計和金額合計了,這就是數(shù)據(jù)不一致。

為了解決這個問題,我們就可以使用觸發(fā)器,規(guī)定每當(dāng)進貨單明細表有數(shù)據(jù)插入、修改和刪除的操作

時,自動觸發(fā) 2 步操作:

1)重新計算進貨單明細表中的數(shù)量合計和金額合計;

2)用第一步中計算出來的值更新進貨單頭表中的合計數(shù)量與合計金額。

這樣一來,進貨單頭表中的合計數(shù)量與合計金額的值,就始終與進貨單明細表中計算出來的合計數(shù)量與

合計金額的值相同,數(shù)據(jù)就是一致的,不會互相矛盾。

2、觸發(fā)器可以幫助我們記錄操作日志。

利用觸發(fā)器,可以具體記錄什么時間發(fā)生了什么。比如,記錄修改會員儲值金額的觸發(fā)器,就是一個很

好的例子。這對我們還原操作執(zhí)行時的具體場景,更好地定位問題原因很有幫助。

3、觸發(fā)器還可以用在操作數(shù)據(jù)前,對數(shù)據(jù)進行合法性檢查。

比如,超市進貨的時候,需要庫管錄入進貨價格。但是,人為操作很容易犯錯誤,比如說在錄入數(shù)量的

時候,把條形碼掃進去了;錄入金額的時候,看串了行,錄入的價格遠超售價,導(dǎo)致賬面上的巨虧......

這些都可以通過觸發(fā)器,在實際插入或者更新操作之前,對相應(yīng)的數(shù)據(jù)進行檢查,及時提示錯誤,防止

錯誤數(shù)據(jù)進入系統(tǒng)。

觸發(fā)器的缺點

1、觸發(fā)器最大的一個問題就是可讀性差。

因為觸發(fā)器存儲在數(shù)據(jù)庫中,并且由事件驅(qū)動,這就意味著觸發(fā)器有可能 不受應(yīng)用層的控制 。這對系統(tǒng)維護是非常有挑戰(zhàn)的。

比如,創(chuàng)建觸發(fā)器用于修改會員儲值操作。如果觸發(fā)器中的操作出了問題,會導(dǎo)致會員儲值金額更新失敗。我用下面的代碼演示一下

MySQL觸發(fā)器怎么創(chuàng)建和使用

結(jié)果顯示,系統(tǒng)提示錯誤,字段“aa”不存在。

這是因為,觸發(fā)器中的數(shù)據(jù)插入操作多了一個字段,系統(tǒng)提示錯誤。可是,如果你不了解這個觸發(fā)器,很可能會認為是更新語句本身的問題,或者是會員信息表的結(jié)構(gòu)出了問題。說不定你還會給會員信息表添加一個叫“aa”的字段,試圖解決這個問題,結(jié)果只能是白費力。

2、相關(guān)數(shù)據(jù)的變更,可能會導(dǎo)致觸發(fā)器出錯。

特別是數(shù)據(jù)表結(jié)構(gòu)的變更,都可能會導(dǎo)致觸發(fā)器出錯,進而影響數(shù)據(jù)操作的正常運行。這些都會由于觸發(fā)器本身的隱蔽性,影響到應(yīng)用中錯誤原因排查的效率。

注意點

注意,如果在子表中定義了外鍵約束,并且外鍵指定了ON UPDATE/DELETE CASCADE/SET NULL子句,此時修改父表被引用的鍵值或刪除父表被引用的記錄行時,也會引起子表的修改和刪除操作,此時基于子表的UPDATE和DELETE語句定義的觸發(fā)器并不會被激活。

例如:基于子表員工表(t_employee)的DELETE語句定義了觸發(fā)器t1,而子表的部門編號(did)字段定義了外鍵約束引用了父表部門表(t_department)的主鍵列部門編號(did),并且該外鍵加了“ONDELETE SET NULL”子句,那么如果此時刪除父表部門表(t_department)在子表員工表(t_employee)

到此,關(guān)于“MySQL觸發(fā)器怎么創(chuàng)建和使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

網(wǎng)頁題目:MySQL觸發(fā)器怎么創(chuàng)建和使用
文章路徑:http://www.rwnh.cn/article32/peoepc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、App設(shè)計、用戶體驗、外貿(mào)建站、、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
邹平县| 柯坪县| 新绛县| 古田县| 寻甸| 昌图县| 健康| 开原市| 临西县| 确山县| 郸城县| 肥城市| 南汇区| 合阳县| 上饶县| 江永县| 灵山县| 云霄县| 昭通市| 达拉特旗| 安泽县| 琼结县| 临汾市| 施秉县| 广西| 辽阳市| 永新县| 东城区| 会同县| 浏阳市| 曲阜市| 邵阳市| 固镇县| 彭山县| 兖州市| 金阳县| 浮山县| 静乐县| 广河县| 南丹县| 东光县|