<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在實際開發中,我們經常會遇到這樣的情況:有 2 個或者多個相互關聯的表,如 商品資訊 和 庫存資訊 分 別存放在 2 個不同的資料表中,我們在新增一條新商品記錄的時候,為了保證資料的完整性,必須同時 在庫存表中新增一條庫存記錄。 這樣一來,我們就必須把這兩個關聯的操作步驟寫到程式裡面,而且要用 事務 包裹起來,確保這兩個操 作成為一個 原子操作 ,要麼全部執行,要麼全部不執行。
要是遇到特殊情況,可能還需要對資料進行手 動維護,這樣就很 容易忘記其中的一步 ,導致資料缺失。 這個時候,咱們可以使用觸發器。你可以建立一個觸發器,讓商品資訊資料的插入操作自動觸發庫存數 據的插入操作。這樣一來,就不用擔心因為忘記新增庫存資料而導致的資料缺失了。
MySQL從 5 . 0 . 2 版本開始支援觸發器。 MySQL的觸發器和儲存過程一樣,都是嵌入到MySQL伺服器的一 段程式。 觸發器是由 事件來觸發 某個操作,這些事件包括 INSERT 、 UPDATE 、 DELETE 事件。
所謂事件就是指 使用者的動作或者觸發某項行為。如果定義了觸發程式,當資料庫執行這些語句時候,就相當於事件發生 了,就會 自動 激發觸發器執行相應的操作。 當對資料表中的資料執行插入、更新和刪除操作,需要自動執行一些資料庫邏輯時,可以使用觸發器來 實現。
建立觸發器語法
CREATE TRIGGER 觸發器名稱 {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名 FOR EACH ROW 觸發器執行的語句塊;
說明:
表名 :表示觸發器監控的物件。
BEFORE | AFTER :表示觸發的時間。 BEFORE 表示在事件之前觸發; AFTER 表示在事件之後觸發。
INSERT | UPDATE | DELETE :表示觸發的事件。
INSERT 表示插入記錄時觸發;
UPDATE 表示更新記錄時觸發;
DELETE 表示刪除記錄時觸發。
建立倆張表
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 ) ) ;
建立觸發器
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資料表中插入資料
INSERT INTO test_trigger (t_note) VALUES ('測試 BEFORE INSERT 觸發器');
檢視test_trigger_log資料表中的資料
SELECT * FROM test_trigger_log
建立觸發器
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資料表中插入資料。
INSERT INTO test_trigger (t_note) VALUES ('測試 AFTER INSERT 觸發器');
檢視test_trigger_log資料表中的資料
SELECT * FROM test_trigger_log
定義觸發器“salary_check_trigger”,基於員工表“employees”的INSERT事件,在INSERT之前檢查將要新增的新員工薪資是否大於他領導的薪資,如果大於領導薪資,則報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 = '薪資高於領導薪資錯誤'; END IF; END // DELIMITER ;
上面觸發器宣告過程中的NEW關鍵字代表INSERT新增語句的新記錄。
方式1:檢視當前資料庫的所有觸發器的定義
SHOW TRIGGERS
方式2:檢視當前資料庫中某個觸發器的定義方式
SHOW CREATE TRIGGER 觸發器名
方式3:從系統庫information_schema的TRIGGERS表中查詢“salary_check_trigger”觸發器的資訊。
SELECT * FROM information_schema.TRIGGERS;
刪除觸發器
DROP TRIGGER IF EXISTS 觸發器名稱
1、觸發器可以確保資料的完整性。
假設我們用 進貨單頭表 (demo.importhead)來儲存進貨單的總體資訊,包括進貨單編號、供貨商編號、倉庫編號、總計進貨數量、總計進貨金額和驗收日期。
用 進貨單明細表 (demo.importdetails)來儲存進貨商品的明細,包括進貨單編號、商品編號、進貨數
量、進貨價格和進貨金額額就不等於進貨單明細表中數量合計和金額合計了,這就是資料不一致。
為了解決這個問題,我們就可以使用觸發器,規定每當進貨單明細表有資料插入、修改和刪除的操作
時,自動觸發 2 步操作:
1)重新計算進貨單明細表中的數量合計和金額合計;
2)用第一步中計算出來的值更新進貨單頭表中的合計數量與合計金額。
這樣一來,進貨單頭表中的合計數量與合計金額的值,就始終與進貨單明細表中計算出來的合計數量與
合計金額的值相同,資料就是一致的,不會互相矛盾。
2、觸發器可以幫助我們記錄操作紀錄檔。
利用觸發器,可以具體記錄什麼時間發生了什麼。比如,記錄修改會員儲值金額的觸發器,就是一個很
好的例子。這對我們還原操作執行時的具體場景,更好地定位問題原因很有幫助。
3、觸發器還可以用在運算元據前,對資料進行合法性檢查。
比如,超市進貨的時候,需要庫管錄入進貨價格。但是,人為操作很容易犯錯誤,比如說在錄入數量的
時候,把條形碼掃進去了;錄入金額的時候,看串了行,錄入的價格遠超售價,導致賬面上的鉅虧......
這些都可以通過觸發器,在實際插入或者更新操作之前,對相應的資料進行檢查,及時提示錯誤,防止
錯誤資料進入系統。
1、觸發器最大的一個問題就是可讀性差。
因為觸發器儲存在資料庫中,並且由事件驅動,這就意味著觸發器有可能 不受應用層的控制 。這對系統維護是非常有挑戰的。
比如,建立觸發器用於修改會員儲值操作。如果觸發器中的操作出了問題,會導致會員儲值金額更新失敗。我用下面的程式碼演示一下
結果顯示,系統提示錯誤,欄位“aa”不存在。
這是因為,觸發器中的資料插入操作多了一個欄位,系統提示錯誤。可是,如果你不瞭解這個觸發器,很可能會認為是更新語句本身的問題,或者是會員資訊表的結構出了問題。說不定你還會給會員資訊表新增一個叫“aa”的欄位,試圖解決這個問題,結果只能是白費力。
2、相關資料的變更,可能會導致觸發器出錯。
特別是資料表結構的變更,都可能會導致觸發器出錯,進而影響資料操作的正常執行。這些都會由於觸發器本身的隱蔽性,影響到應用中錯誤原因排查的效率。
注意,如果在子表中定義了外來鍵約束,並且外來鍵指定了ON UPDATE/DELETE CASCADE/SET NULL子句,此時修改父表被參照的鍵值或刪除父表被參照的記錄行時,也會引起子表的修改和刪除操作,此時基於子表的UPDATE和DELETE語句定義的觸發器並不會被啟用。
例如:基於子表員工表(t_employee)的DELETE語句定義了觸發器t1,而子表的部門編號(did)欄位定義了外來鍵約束參照了父表部門表(t_department)的主鍵列部門編號(did),並且該外來鍵加了“ONDELETE SET NULL”子句,那麼如果此時刪除父表部門表(t_department)在子表員工表(t_employee)
到此這篇關於MySQL深入淺出精講觸發器用法的文章就介紹到這了,更多相關MySQL觸發器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45