亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL觸發(fā)器的使用和優(yōu)缺點(diǎn)介紹

 更新時(shí)間:2021年12月01日 15:34:32   作者:葉綠體不忘呼吸  
大家好,本篇文章主要講的是MySQL觸發(fā)器的使用和優(yōu)缺點(diǎn)介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下哦,方便下次瀏覽

前言

在實(shí)際開發(fā)中,我們經(jīng)常會(huì)遇到這樣的情況:有 2 個(gè)或者多個(gè)相互關(guān)聯(lián)的表,如 商品信息和庫(kù)存信息分別存放在2個(gè)不同的數(shù)據(jù)表中,我們?cè)谔砑右粭l新商品記錄的時(shí)候,為了保證數(shù)據(jù)的完整性,必須同時(shí)在庫(kù)存表中添加一條庫(kù)存記錄。

這樣一來,我們就必須把這兩個(gè)關(guān)聯(lián)的操作步驟寫到程序里面,而且要用事務(wù)包裹起來,確保這兩個(gè)操作成為一個(gè)原子操作 ,要么全部執(zhí)行,要么全部不執(zhí)行。

要是遇到特殊情況,可能還需要對(duì)數(shù)據(jù)進(jìn)行手動(dòng)維護(hù),這樣就很 容易忘記其中的一步 ,導(dǎo)致數(shù)據(jù)缺失。這個(gè)時(shí)候,咱們可以使用觸發(fā)器。

你可以創(chuàng)建一個(gè)觸發(fā)器,讓商品信息數(shù)據(jù)的插入操作自動(dòng)觸發(fā)庫(kù)存數(shù)據(jù)的插入操作。這樣一來,就不用擔(dān)心因?yàn)橥浱砑訋?kù)存數(shù)據(jù)而導(dǎo)致的數(shù)據(jù)缺失了。

1. 觸發(fā)器概述

MySQL從 5.0.2 版本開始支持觸發(fā)器。MySQL的觸發(fā)器和存儲(chǔ)過程一樣,都是嵌入到MySQL服務(wù)器的一段程序。

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

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

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

創(chuàng)建觸發(fā)器的語法結(jié)構(gòu)是:

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

說明:

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

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

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

INSERT 表示插入記錄;

UPDATE 表示更新記錄;

DELETE 表示刪除記錄。

④觸發(fā)器執(zhí)行的語句塊 :可以是單條SQL語句,也可以是由BEGIN…END結(jié)構(gòu)組成的復(fù)合語句塊。

2.2 代碼舉例

舉例:

①創(chuàng)建數(shù)據(jù)表:

CREATE TABLE test_trigger (
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ā)器:創(chuàng)建名稱為before_insert的觸發(fā)器,向test_trigger數(shù)據(jù)表插入數(shù)據(jù)之前,向test_trigger_log數(shù)據(jù)表中插入before_insert的日志信息。

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

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

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

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

mysql> SELECT * FROM test_trigger_log;
+----+---------------+
| id | t_log |
+----+---------------+
| 1 | before_insert |
+----+---------------+
1 row in set (0.00 sec)

3. 查看、刪除觸發(fā)器

3.1 查看觸發(fā)器

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

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

SHOW TRIGGERS\G

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

SHOW CREATE TRIGGER 觸發(fā)器名

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

SELECT * FROM information_schema.TRIGGERS;

3.2 刪除觸發(fā)器

觸發(fā)器也是數(shù)據(jù)庫(kù)對(duì)象,刪除觸發(fā)器也用DROP語句,語法格式如下:

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

4. 觸發(fā)器的優(yōu)缺點(diǎn)

4.1 優(yōu)點(diǎn)

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

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

在這里插入圖片描述

用 進(jìn)貨單明細(xì)表 (demo.importdetails)來保存進(jìn)貨商品的明細(xì),包括進(jìn)貨單編號(hào)、商品編號(hào)、進(jìn)貨數(shù)量、進(jìn)貨價(jià)格和進(jìn)貨金額。

在這里插入圖片描述

每當(dāng)我們錄入、刪除和修改一條進(jìn)貨單明細(xì)數(shù)據(jù)的時(shí)候,進(jìn)貨單明細(xì)表里的數(shù)據(jù)就會(huì)發(fā)生變動(dòng)。這個(gè)時(shí)候,在進(jìn)貨單頭表中的總計(jì)數(shù)量和總計(jì)金額就必須重新計(jì)算,否則,進(jìn)貨單頭表中的總計(jì)數(shù)量和總計(jì)金額就不等于進(jìn)貨單明細(xì)表中數(shù)量合

計(jì)和金額合計(jì)了,這就是數(shù)據(jù)不一致。

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

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

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

這樣一來,進(jìn)貨單頭表中的合計(jì)數(shù)量與合計(jì)金額的值,就始終與進(jìn)貨單明細(xì)表中計(jì)算出來的合計(jì)數(shù)量與合計(jì)金額的值相同,數(shù)據(jù)就是一致的,不會(huì)互相矛盾。

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

利用觸發(fā)器,可以具體記錄什么時(shí)間發(fā)生了什么。比如,記錄修改會(huì)員儲(chǔ)值金額的觸發(fā)器,就是一個(gè)很好的例子。這對(duì)我們還原操作執(zhí)行時(shí)的具體場(chǎng)景,更好地定位問題原因很有幫助。

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

比如,超市進(jìn)貨的時(shí)候,需要庫(kù)管錄入進(jìn)貨價(jià)格。但是,人為操作很容易犯錯(cuò)誤,比如說在錄入數(shù)量的時(shí)候,把條形碼掃進(jìn)去了;錄入金額的時(shí)候,看串了行,錄入的價(jià)格遠(yuǎn)超售價(jià),導(dǎo)致賬面上的巨虧。這些都可以通過觸發(fā)器,在實(shí)際插入

或者更新操作之前,對(duì)相應(yīng)的數(shù)據(jù)進(jìn)行檢查,及時(shí)提示錯(cuò)誤,防止錯(cuò)誤數(shù)據(jù)進(jìn)入系統(tǒng)。

4.2 缺點(diǎn)

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

因?yàn)橛|發(fā)器存儲(chǔ)在數(shù)據(jù)庫(kù)中,并且由事件驅(qū)動(dòng),這就意味著觸發(fā)器有可能 不受應(yīng)用層的控制 。這對(duì)系統(tǒng)維護(hù)是非常有挑戰(zhàn)的。比如,創(chuàng)建觸發(fā)器用于修改會(huì)員儲(chǔ)值操作。如果觸發(fā)器中的操作出了問題,會(huì)導(dǎo)致會(huì)員儲(chǔ)值金額更新失敗。我用

下面的代碼演示一下:

mysql> update demo.membermaster set memberdeposit=20 where memberid = 2;
ERROR 1054 (42S22): Unknown column 'aa' in 'field list'

結(jié)果顯示,系統(tǒng)提示錯(cuò)誤,字段“aa”不存在。這是因?yàn)椋|發(fā)器中的數(shù)據(jù)插入操作多了一個(gè)字段,系統(tǒng)提示錯(cuò)誤。可是,如果你不了解這個(gè)觸發(fā)器,很可能會(huì)認(rèn)為是更新語句本身的問題,或者是會(huì)員信息表的結(jié)構(gòu)出了問題。說不定你還會(huì)給

會(huì)員信息表添加一個(gè)叫“aa”的字段,試圖解決這個(gè)問題,結(jié)果只能是白費(fèi)力。

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

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

4.3 注意點(diǎn)

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

句定義的觸發(fā)器并不會(huì)被激活。

到此這篇關(guān)于MySQL觸發(fā)器的使用和優(yōu)缺點(diǎn)介紹的文章就介紹到這了,更多相關(guān)MySQL觸發(fā)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • Mysql數(shù)據(jù)庫(kù)中數(shù)字相減 出現(xiàn)負(fù)數(shù)時(shí)sql 語句報(bào)錯(cuò)的問題

    Mysql數(shù)據(jù)庫(kù)中數(shù)字相減 出現(xiàn)負(fù)數(shù)時(shí)sql 語句報(bào)錯(cuò)的問題

    這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)中數(shù)字相減 出現(xiàn)負(fù)數(shù)時(shí)sql 語句報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Win7下安裝MySQL5.7.16過程記錄

    Win7下安裝MySQL5.7.16過程記錄

    這篇文章主要為大家分享了Win7下安裝MySQL5.7.16過程的筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • MySql 如何實(shí)現(xiàn)無則插入有則更新

    MySql 如何實(shí)現(xiàn)無則插入有則更新

    這篇文章主要介紹了MySql 實(shí)現(xiàn)無則插入有則更新的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • MySQL的join buffer原理

    MySQL的join buffer原理

    這篇文章主要介紹了MySQL的join buffer原理,幫助大家更好的理解和學(xué)習(xí)使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2021-04-04
  • 深入理解MySQL中的事務(wù)機(jī)制

    深入理解MySQL中的事務(wù)機(jī)制

    這篇文章主要介紹了MySQL中的事務(wù)機(jī)制,事務(wù)機(jī)制在各大MySQL教程中均為重要知識(shí),需要的朋友可以參考下
    2015-06-06
  • win10上如何安裝mysql5.7.16(解壓縮版)

    win10上如何安裝mysql5.7.16(解壓縮版)

    這篇文章主要介紹了win10上如何安裝mysql5.7.16(解壓縮版)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • mysql grants小記

    mysql grants小記

    grant命令是對(duì)mysql數(shù)據(jù)庫(kù)進(jìn)行用戶創(chuàng)建,權(quán)限或其他參數(shù)控制的強(qiáng)大的命令,官網(wǎng)上介紹它就有幾大頁,要用精它恐怕不是一日半早的事情,權(quán)宜根據(jù)心得慢慢領(lǐng)會(huì)吧!
    2011-05-05
  • 圖解MySQL中樂觀鎖扣減庫(kù)存原理

    圖解MySQL中樂觀鎖扣減庫(kù)存原理

    這篇文章主要為大家詳細(xì)介紹了MySQL中樂觀鎖扣減庫(kù)存原理的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04
  • MYSQL 左連接右連接和內(nèi)連接的詳解及區(qū)別

    MYSQL 左連接右連接和內(nèi)連接的詳解及區(qū)別

    這篇文章主要介紹了MYSQL 左連接右連接和內(nèi)連接的詳解及區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • 最新評(píng)論