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

MySQL中的觸發(fā)器trigger用法解析

 更新時間:2023年08月09日 09:57:40   作者:大腦不能為空  
這篇文章主要介紹了MySQL中的觸發(fā)器trigger用法解析,觸發(fā)器是由?事件來觸發(fā)?某個操作,這些事件包括?INSERT、UPDATE、DELETE事件,事件就是指用戶的動作或者觸發(fā)某項行為,需要的朋友可以參考下

1. 觸發(fā)器概述

MySQL從 5.0.2 版本開始支持觸發(fā)器。

MySQL的觸發(fā)器和存儲過程一樣,都是嵌入到MySQL服務(wù)器的一段程序。

觸發(fā)器是由 事件來觸發(fā) 某個操作,這些事件包括 INSERT 、 UPDATE 、 DELETE 事件。

所謂事件就是指用戶的動作或者觸發(fā)某項行為。

如果定義了觸發(fā)程序,當數(shù)據(jù)庫執(zhí)行這些語句時候,就相當于事件發(fā)生了,就會 自動 激發(fā)觸發(fā)器執(zhí)行相應(yīng)的操作。

當對數(shù)據(jù)表中的數(shù)據(jù)執(zhí)行插入、更新和刪除操作,需要自動執(zhí)行一些數(shù)據(jù)庫邏輯時,可以使用觸發(fā)器來實現(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)控的對象。
  • BEFORE|AFTER :表示觸發(fā)的時間。BEFORE 表示在事件之前觸發(fā);AFTER 表示在事件之后觸發(fā)。
  • INSERT|UPDATE|DELETE :表示觸發(fā)的事件。
    • INSERT 表示插入記錄時觸發(fā);
    • UPDATE 表示更新記錄時觸發(fā);
    • DELETE 表示刪除記錄時觸發(fā)。
  • 觸發(fā)器執(zhí)行的語句塊 :可以是單條SQL語句,也可以是由BEGIN…END結(jié)構(gòu)組成的復(fù)合語句塊。

2.2 代碼舉例

舉例1:

1、創(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)
);

2、創(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 ;

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

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

4、查看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)

舉例2:

1.創(chuàng)建名稱為after_insert的觸發(fā)器,向test_trigger數(shù)據(jù)表插入數(shù)據(jù)之后,向test_trigger_log數(shù)據(jù)表中插入after_insert的日志信息。

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 ;

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

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

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

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

舉例3:

定義觸發(fā)器“salary_check_trigger”,基于員工表“employees”的INSERT事件,在INSERT之前檢查將要添加的新員工薪資是否大于他領(lǐng)導的薪資,如果大于領(lǐng)導薪資,則報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)導薪資錯誤';
	END IF;
END //
DELIMITER ;

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

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

3.1 查看觸發(fā)器

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

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

SHOW TRIGGERS\G

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

SHOW CREATE TRIGGER 觸發(fā)器名

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

SELECT * FROM information_schema.TRIGGERS;

3.2 刪除觸發(fā)器

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

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

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

4.1 優(yōu)點

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

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

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

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

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

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

比如,超市進貨的時候,需要庫管錄入進貨價格。但是,人為操作很容易犯錯誤,比如說在錄入數(shù)量的時候,把條形碼掃進去了;錄入金額的時候,看串了行,錄入的價格遠超售價,導致賬面上的巨虧……這些都可以通過觸發(fā)器,在實際插入或者更新操作之前,對相應(yīng)的數(shù)據(jù)進行檢查,及時提示錯誤,防止錯誤數(shù)據(jù)進入系統(tǒng)。

4.2 缺點

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

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

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

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

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

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

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

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

4.3 注意點

聯(lián)動(非直接操作)修改或刪除,并不會激活觸發(fā)器。

注意,如果在子表中定義了外鍵約束,并且外鍵指定了 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)有匹配記錄的部門記錄時,會引起子表員工表(t_employee)匹配記錄的部門編號(did)修改為NULL,但是此時不會激活觸發(fā)器t1。只有直接對子表員工表(t_employee)執(zhí)行DELETE語句時才會激活觸發(fā)器t1。

到此這篇關(guān)于MySQL中的觸發(fā)器trigger用法解析的文章就介紹到這了,更多相關(guān)MySQL觸發(fā)器trigger內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL中or語句用法示例

    MySQL中or語句用法示例

    這篇文章主要介紹了MySQL中or語句用法示例,小編覺得挺不錯的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • mysql刪除字段的基本語法和示例

    mysql刪除字段的基本語法和示例

    在MySQL中,使用ALTER?TABLE語句配合DROP?COLUMN子句可以刪除表中的某個字段,示例中,從employees表中刪除email字段,此操作會永久刪除該字段的數(shù)據(jù),因此需提前備份,需要的朋友可以參考下
    2024-09-09
  • 詳解MySQL事務(wù)的隔離級別與MVCC

    詳解MySQL事務(wù)的隔離級別與MVCC

    這篇文章主要介紹了MySQL事務(wù)的隔離級別與MVCC的相關(guān)資料,幫助大家更好的理解和學習使用MySQL,感興趣的朋友可以了解下
    2021-04-04
  • IDEA連接不上MySQL端口號占用的解決

    IDEA連接不上MySQL端口號占用的解決

    這篇文章主要介紹了IDEA連接不上MySQL端口號占用的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Mysql using使用詳解

    Mysql using使用詳解

    本文主要介紹了Mysql using使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • mysql查詢語句中用戶變量的使用代碼解析

    mysql查詢語句中用戶變量的使用代碼解析

    這篇文章主要介紹了mysql查詢語句中用戶變量的使用代碼解析,涉及部分代碼優(yōu)化的內(nèi)容,通過示例向大家解析用戶變量的相關(guān)問題,需要的朋友可以參考下。
    2017-10-10
  • MySQL5.7 JSON類型使用詳解

    MySQL5.7 JSON類型使用詳解

    MySQL5.7發(fā)布后,專門設(shè)計了JSON數(shù)據(jù)類型以及關(guān)于這種類型的檢索以及其他函數(shù)解析。 我們先看看MySQL老版本的JSON存取方式,具體內(nèi)容詳情大家參考下本文吧
    2017-10-10
  • MySql like模糊查詢通配符使用詳細介紹

    MySql like模糊查詢通配符使用詳細介紹

    MySQL提供標準的SQL模式匹配,以及一種基于象Unix實用程序如vi、grep和sed的擴展正則表達式模式匹配的格式
    2013-10-10
  • MySQL五步走JDBC編程全解讀

    MySQL五步走JDBC編程全解讀

    JDBC是指Java數(shù)據(jù)庫連接,是一種標準Java應(yīng)用編程接口(?JAVA?API),用來連接?Java?編程語言和廣泛的數(shù)據(jù)庫。從根本上來說,JDBC?是一種規(guī)范,它提供了一套完整的接口,允許便攜式訪問到底層數(shù)據(jù)庫,本篇文章我們來了解MySQL連接JDBC的五步走流程方法
    2022-01-01
  • mysql如何才能保證數(shù)據(jù)的一致性

    mysql如何才能保證數(shù)據(jù)的一致性

    這篇文章主要介紹了mysql如何才能保證數(shù)據(jù)的一致性問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教<BR>
    2024-03-03

最新評論