自动,MySQL触发器,完整详细可收藏
文章目錄
- 1. 觸發器概述
- 2. 觸發器的創建
- 3. 查看、刪除觸發器
- 4. 觸發器的優缺點
在實際開發中,我們經常會遇到這樣的情況:有 2 個或者多個相互關聯的表,如 商品信息和庫存信息分別存放在2個不同的數據表中,我們在添加一條新商品記錄的時候,為了保證數據的完整性,必須同時在庫存表中添加一條庫存記錄。這樣一來,我們就必須把這兩個關聯的操作步驟寫到程序里面,而且要用事務包裹起來,確保這兩個操作成為一個原子操作 ,要么全部執行,要么全部不執行。要是遇到特殊情況,可能還需要對數據進行手動維護,這樣就很 容易忘記其中的一步 ,導致數據缺失。這個時候,咱們可以使用觸發器。你可以創建一個觸發器,讓商品信息數據的插入操作自動觸發庫存數據的插入操作。這樣一來,就不用擔心因為忘記添加庫存數據而導致的數據缺失了。
1. 觸發器概述
MySQL從 5.0.2 版本開始支持觸發器。MySQL的觸發器和存儲過程一樣,都是嵌入到MySQL服務器的一段程序。
觸發器是由事件來觸發某個操作,這些事件包括 INSERT 、 UPDATE 、 DELETE 事件。所謂事件就是指用戶的動作或者觸發某項行為。如果定義了觸發程序,當數據庫執行這些語句時候,就相當于事件發生了,就會自動激發觸發器執行相應的操作。當對數據表中的數據執行插入、更新和刪除操作,需要自動執行一些數據庫邏輯時,可以使用觸發器來實現。
2. 觸發器的創建
2.1 創建觸發器語法
創建觸發器的語法結構是:
說明:
①表名 :表示觸發器監控的對象。
②BEFORE|AFTER :表示觸發的時間。BEFORE 表示在事件之前觸發;AFTER 表示在事件之后觸發。
③INSERT|UPDATE|DELETE :表示觸發的事件。
INSERT 表示插入記錄;
UPDATE 表示更新記錄;
DELETE 表示刪除記錄。
④觸發器執行的語句塊 :可以是單條SQL語句,也可以是由BEGIN…END結構組成的復合語句塊。
2.2 代碼舉例
舉例:
①創建數據表:
②創建觸發器:創建名稱為before_insert的觸發器,向test_trigger數據表插入數據之前,向test_trigger_log數據表中插入before_insert的日志信息。
DELIMITER // CREATE TRIGGER before_insert BEFORE INSERT ON test_trigger FOR EACH ROW BEGININSERT INTO test_trigger_log (t_log)VALUES('before_insert'); END // DELIMITER ;③向test_trigger數據表中插入數據
INSERT INTO test_trigger (t_note) VALUES ('測試 BEFORE INSERT 觸發器');④查看test_trigger_log數據表中的數據
mysql> SELECT * FROM test_trigger_log; +----+---------------+ | id | t_log | +----+---------------+ | 1 | before_insert | +----+---------------+ 1 row in set (0.00 sec)3. 查看、刪除觸發器
3.1 查看觸發器
查看觸發器是查看數據庫中已經存在的觸發器的定義、狀態和語法信息等。
方式1:查看當前數據庫的所有觸發器的定義
方式2:查看當前數據庫中某個觸發器的定義
SHOW CREATE TRIGGER 觸發器名方式3:從系統庫information_schema的TRIGGERS表中查詢“salary_check_trigger”觸發器的信息
SELECT * FROM information_schema.TRIGGERS;3.2 刪除觸發器
觸發器也是數據庫對象,刪除觸發器也用DROP語句,語法格式如下:
4. 觸發器的優缺點
4.1 優點
①觸發器可以確保數據的完整性。
假設我們用 進貨單頭表 (demo.importhead)來保存進貨單的總體信息,包括進貨單編號、供貨商編號、倉庫編號、總計進貨數量、總計進貨金額和驗收日期。
用 進貨單明細表 (demo.importdetails)來保存進貨商品的明細,包括進貨單編號、商品編號、進貨數量、進貨價格和進貨金額。
每當我們錄入、刪除和修改一條進貨單明細數據的時候,進貨單明細表里的數據就會發生變動。這個時候,在進貨單頭表中的總計數量和總計金額就必須重新計算,否則,進貨單頭表中的總計數量和總計金額就不等于進貨單明細表中數量合計和金額合計了,這就是數據不一致。
為了解決這個問題,我們就可以使用觸發器,規定每當進貨單明細表有數據插入、修改和刪除的操作時,自動觸發 2 步操作:
1)重新計算進貨單明細表中的數量合計和金額合計;
2)用第一步中計算出來的值更新進貨單頭表中的合計數量與合計金額。
這樣一來,進貨單頭表中的合計數量與合計金額的值,就始終與進貨單明細表中計算出來的合計數量與合計金額的值相同,數據就是一致的,不會互相矛盾。
②觸發器可以幫助我們記錄操作日志。
利用觸發器,可以具體記錄什么時間發生了什么。比如,記錄修改會員儲值金額的觸發器,就是一個很好的例子。這對我們還原操作執行時的具體場景,更好地定位問題原因很有幫助。
③觸發器還可以用在操作數據前,對數據進行合法性檢查。
比如,超市進貨的時候,需要庫管錄入進貨價格。但是,人為操作很容易犯錯誤,比如說在錄入數量的時候,把條形碼掃進去了;錄入金額的時候,看串了行,錄入的價格遠超售價,導致賬面上的巨虧。這些都可以通過觸發器,在實際插入或者更新操作之前,對相應的數據進行檢查,及時提示錯誤,防止錯誤數據進入系統。
4.2 缺點
①觸發器最大的一個問題就是可讀性差。
因為觸發器存儲在數據庫中,并且由事件驅動,這就意味著觸發器有可能 不受應用層的控制 。這對系統維護是非常有挑戰的。比如,創建觸發器用于修改會員儲值操作。如果觸發器中的操作出了問題,會導致會員儲值金額更新失敗。我用下面的代碼演示一下:
結果顯示,系統提示錯誤,字段“aa”不存在。這是因為,觸發器中的數據插入操作多了一個字段,系統提示錯誤。可是,如果你不了解這個觸發器,很可能會認為是更新語句本身的問題,或者是會員信息表的結構出了問題。說不定你還會給會員信息表添加一個叫“aa”的字段,試圖解決這個問題,結果只能是白費力。
②相關數據的變更,可能會導致觸發器出錯。
特別是數據表結構的變更,都可能會導致觸發器出錯,進而影響數據操作的正常運行。這些都會由于觸發器本身的隱蔽性,影響到應用中錯誤原因排查的效率。
4.3 注意點
注意,如果在子表中定義了外鍵約束,并且外鍵指定了ON UPDATE/DELETE CASCADE/SET NULL子句,此時修改父表被引用的鍵值或刪除父表被引用的記錄行時,也會引起子表的修改和刪除操作,此時基于子表的UPDATE和DELETE語句定義的觸發器并不會被激活。
總結
以上是生活随笔為你收集整理的自动,MySQL触发器,完整详细可收藏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 路由器恢复出厂设置后怎么操作路由器如何恢
- 下一篇: 新年迈出Java后台服务器与数据库交互第