MySQL觸發器(轉載)

觸發器(trigger)是數據庫中的一個很重要的、很實用的基于事件的處理器,在處理一些業務需求的時候,使用觸發器會很方便。似乎在《高性能MySQL》中,對觸發器作了一定的描述,也提到使用中的一些優勢和局限性,但感覺還是不能完全理解觸發器的全部功能和實現。于是自己在網上看了一些文章,結合官網(https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html)中的案例,寫下這篇總結。

?

基本理解:

1. 使用場合:

觸發器是基于事件的,主要的事件也就是MySQL的增刪改操作,即insert,delete,update。

2. 觸發器的命名

Trigger names exist in the schema namespace, meaning that all triggers must have unique names within a schema. Triggers in different schemas can have the same name.

因為觸發器在單表的命名空間內,所以同一個表的觸發器名稱需要不同。不同表可以有相同的觸發器名稱。

3. 觸發器執行順序

如果有相同的update(或者delete,insert)觸發器,就會按照創建的時間來執行。

而FOLLOWS 和 PRECEDES 可以修改trigger的執行順序

例如官方的案例:

mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account

?????? FOR EACH ROW?PRECEDES?ins_sum

?????? SET

?????? @deposits = @deposits + IF(NEW.amount>0,NEW.amount,0),

?????? @withdrawals = @withdrawals + IF(NEW.amount<0,-NEW.amount,0);

Query OK, 0 rows affected (0.01 sec)

?

ins_transaction和ins_sum分別是兩個觸發器的名稱。

?

4.?觸發器的作用

1. 安全性。可以基于數據庫的值使用戶具有操作數據庫的某種權利。

1)可以基于時間限制用戶的操作,例如不允許下班后和節假日修改數據庫數據。

2)可以基于數據庫中的數據限制用戶的操作,例如不允許單個商品的購買量大于一個固定值。

2. 審計。可以跟蹤用戶對數據庫的操作。??

?1)審計用戶操作數據庫的語句。

?2)把用戶對數據庫的更新寫入審計表。

這一塊因為本人沒有用過,就不贅述了,以后有機會來補充

3. 實現復雜的數據完整性規則

實現非標準的數據完整性檢查和約束。觸發器可產生比規則更為復雜的限制。與規則不同,觸發器可以引用列或數據庫對象。例如,觸發器可回退任何企圖吃進超過自己保證金的期貨。

4. 實現復雜的非標準的數據庫相關完整性規則。

1)觸發器可以對數據庫中相關的表進行連環更新。這是用得比較多的一種實現功能。

2) 觸發器能夠拒絕或回退那些破壞相關完整性的變化,取消試圖進行數據更新的事務。當插入一個與其主健不匹配的外部鍵時,這種觸發器會起作用。

下面的例子我會比較詳細的描述這兩個特性。

5. 同步實時地復制表中的數據。

6. 自動計算數據值,如果數據的值達到了一定的要求,則進行特定的處理。

例如,如果公司的帳號上的資金低于5萬元則立即給財務人員發送警告數據。

?

1)插入數據:

當用戶添加一個訂單的時候,我們需要對商品表格中的庫存(storage)進行相應的改動

復制代碼
 
復制代碼

?

查詢結果:

復制代碼
 
復制代碼

?

關于newold的使用

new表示新的數據行,而old表示舊的數據行

?

2)刪除數據

例如,用戶撤銷一個訂單的時候,我們需要將商品的數量加回去

?

復制代碼
 
復制代碼

?

?

結果:

?

?

3)更新數據(可增可減)

當用戶對想通過修改購物車的數量來修改自己購買某種商品的數量,那么,我們的庫存也需要跟著改動。

?

查看觸發器命令

show triggers

這個命令只能看到都有哪些的triggers,而看不到trigger的具體信息。

?

所有觸發器信息都存儲在information_schema數據庫下的triggers表中,可以使用SELECT語句查詢。如果有很多個觸發器,最好通過TRIGGER_NAME字段指定查詢某一個觸發器。

例如:

SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='XXX';

?

?

(4)限制條件

條件限制對一些涉及到金額的場合(如開篇提到的)非常重要,在電商的限購數額中也會有應用。

trigger利用delimiter,begin和if語句塊實現限制條件。

復制代碼
 
復制代碼

條件語句程序塊用begin和end包裹起來實現

delimiter:切換結束符,因為;是MySQL中默認的結束符,如果程序塊中出現;符號,就會引起沖突。最后要將結束符修改回來。注意delimiter與結束符之間有空格,否則會無法切換。

?

更新數據前:

?

更新數據:

?

更新數據后:

購買量無法超過3

?

?

關于觸發器與事務

對于事務表(Innodb),before語句后面的判斷語句失敗將會導致回滾事件語句執行的所有更改。觸發器失敗會導致語句失敗,因此觸發器失敗也會導致回滾。對于非事務性表(MyISAM),無法執行此類回滾,因此盡管語句失敗,但在錯誤點之前執行的任何更改仍然有效。

?

關于觸發器的使用限制

觸發器執有一些限制:

1. 觸發器不能使用CALL 語句來將數據返回給客戶端或使用動態SQL的存儲過程。但允許存儲過程通過OUT或INOUT 參數將數據返回到觸發器 。

2. 觸發不能使用事務相關的語句,如 START TRANSACTION,COMMIT或ROLLBACK。因為觸發器對update,delete,insert等事件做了處理,并且是按照before,SQL語句,after的順序來執行的,一旦某一步出錯,就會回滾數據。如果在觸發器中使用事務,就會產生矛盾。

轉載于:https://www.cnblogs.com/moondev/p/10188714.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249939.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249939.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

神級bug解決方法

真的是神級bug,util包中的Arrays類導入不了&#xff0c;一直報錯。原因&#xff1a;JDK 1.8和Myeclipse 8.5不兼容&#xff0c;導致java.util.Arrays類無法被編譯。所以報錯。解決方法&#xff1a;1.降低jdk版本。2.升高Myeclipse版本轉載于:https://www.cnblogs.com/yanlongw/…

es6注意點

補救方法&#xff1a; 詳情&#xff1a;http://es6.ruanyifeng.com/#docs/array 取出文本內容 實現深拷貝 jq實現不完全深拷貝 jQuery.extend jQuery.fn.extend function () {var options, name, src, copy, copyIsArray, clone,target arguments[0] || {},i 1,length ar…

input標簽用法解讀

HTML5/HTML中標簽用法解讀 OK&#xff01;今天博主為小伙伴們介紹的內容是HTML5/HTML中標簽的用法&#xff0c;&#xff0c;&#xff0c; &#xff0c;emmm圖文并茂哦&#xff01; 下面正式開始內容的介紹&#xff1a;首先&#xff0c;直觀上說標簽規定了用戶可以在其中輸入數據…

SpringBoot項目遇到的一些問題

SpringBoot項目整合JPA報錯轉載于:https://www.cnblogs.com/xb1223/p/10195054.html

關于SpringBoot中的多數據源集成

引言 其實對于分庫分表這塊的場景&#xff0c;目前市場上有很多成熟的開源中間件&#xff0c;eg&#xff1a;MyCAT&#xff0c;Cobar&#xff0c;sharding-JDBC等。 本文主要是介紹基于springboot的多數據源切換&#xff0c;輕量級的一種集成方案&#xff0c;對于小型的應用可…

實現vue2.0響應式的基本思路

注意&#xff0c;這里只是實現思路的還原&#xff0c;對于里面各種細節的實現&#xff0c;比如說數組里面數據的操作的監聽&#xff0c;以及對象嵌套這些細節本實例都不會涉及到&#xff0c;如果想了解更加細節的實現&#xff0c;可以通過閱讀源碼 observer文件夾以及instance文…

HTML標簽類型及特點

一、 概述 HTML&#xff08;Hyper Text Markup Language &#xff09;作為一種標記語言&#xff0c;網頁所有的內容均書寫在標簽內部&#xff0c;標簽是組成Html頁面的基本元素&#xff0c;因此對標簽特性的理解在HTML的學習過程中比較重要。 二、基本分類 HTML中的標簽從閉…

打開頁面

*<a href"javascript:void(0)" title"google" οnclick"window.parent.addTab(, 測試, Admin/UserRole, 100000)">測試444</a>*轉載于:https://www.cnblogs.com/niyl/p/10196528.html

python 大量使用json 存儲數據時,格式化輸出的方式

import json, pprintdic {name: 234, user_name: yan xia ting yu , list: [ds, a, 2], 你好這是鍵: 檐下聽雨}print(dic)pprint.pprint(dic)print(json.dumps(dic))print(json.dumps(dic, indent2))# {name: 234, user_name: yan xia ting yu , list: [ds, a, 2], 你好這是鍵…

vue computed 源碼分析

我們來看看computed的實現。最簡單的一個demo如下&#xff1a; <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> </head> <body> <div id"app"><div name"test&…

軟件開發文檔整理(之)一張示意圖 | 清晰明了

在整個軟件開發周期&#xff0c;開發文檔是必不可少的資料&#xff0c;它們貫穿于整個開發周期&#xff0c;用來評估計劃、規劃進度、項目管理、軟件測試、軟件發布&#xff0c;可以說至關重要。 ??開發文檔必須歸檔&#xff0c;沒有歸檔的文檔作用大打折扣&#xff0c;時效性…

java大數BinInteger

當我們遇到long不行的時候就要考慮這個BinInteger了&#xff0c;因為這是只要你內存夠大&#xff0c;就能輸入很大的數&#xff0c;用這個處理高精度問題&#xff0c;是很容易的一件事&#xff0c;對于我這剛學java的萌新來說&#xff0c;長見識了&#xff0c;確實比C方便 BigI…

HTML頁面提交TABLE

在HTML頁面里&#xff0c;提交一個TABLE需要把TABLE的值傳入變量或json格式&#xff0c;然后submit到服務端的。 思路描述&#xff1a;將table里的值取出&#xff0c;放在json中&#xff0c;賦給一個input&#xff0c;通過一個input來實現table表數據提交到服務器&#xff0c;就…

生成條形碼

https://packagist.org/packages/picqer/php-barcode-generator轉載于:https://www.cnblogs.com/pansidong/p/9334224.html

3.GDScript(1)概覽

GDScript 是上面提到的用于Godot的主要語言。和其他語言相比&#xff0c;它與Godot高度整合&#xff0c;有許多優點&#xff1a; 簡單&#xff0c;優雅&#xff0c;設計上為Lua、Python、Squirrel等語言用戶所熟悉。加載和編譯速度飛快。編輯器集成非常令人愉快&#xff0c;有節…

Web 前端框架分類解讀

Web前端框架可以分為兩類&#xff1a; JS的類庫框架 JQuery.JS Angular.JS&#xff08;模型&#xff0c; scope作用域&#xff0c;controller&#xff0c;依賴注入&#xff0c;MVVM&#xff09;&#xff1a;前端MVC Vue.JS&#xff08;MVVM&#xff09;***** Reat.JS &…

async / await對異步的處理

雖然co是社區里面的優秀異步解決方案&#xff0c;但是并不是語言標準&#xff0c;只是一個過渡方案。ES7語言層面提供async / await去解決語言層面的難題。目前async / await 在 IE edge中已經可以直接使用了&#xff0c;但是chrome和Node.js還沒有支持。幸運的是&#xff0c;b…

《SQL Server 2008從入門到精通》--20180717

目錄 1.觸發器1.1.DDL觸發器1.2.DML觸發器1.3.創建觸發器1.3.1.創建DML觸發器1.3.2.創建DDL觸發器1.3.3.嵌套觸發器1.3.4.遞歸觸發器1.4.管理觸發器1.觸發器 觸發器是一種特殊的存儲過程&#xff0c;與表緊密關聯。 1.1.DDL觸發器 當服務器或數據庫中發生數據定義語言&#xff…

主成分分析原理解釋(能力工場小馬哥)

主成分分析&#xff08;Principal components analysis&#xff09;-最大方差解釋 在這一篇之前的內容是《Factor Analysis》&#xff0c;由于非常理論&#xff0c;打算學完整個課程后再寫。在寫這篇之前&#xff0c;我閱讀了PCA、SVD和LDA。這幾個模型相近&#xff0c;卻都有自…

div/div作用

<div></div>主要是用來設置涵蓋一個區塊為主&#xff0c;所謂的區塊是包含一行以上的數據&#xff0c;所以在<div></div>的開始之前與結束后&#xff0c;瀏覽都會自動換行&#xff0c;所以夾在<div></div>間的數據&#xff0c;自然會與其前…