日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

关于mysql触发器和存储过程的理解

發(fā)布時間:2024/4/17 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于mysql触发器和存储过程的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

內容源自:一篇很棒的 MySQL 觸發(fā)器學習教程

一、觸發(fā)器概念

? ? ? ?觸發(fā)器(trigger):監(jiān)視某種情況,并觸發(fā)某種操作,它是提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執(zhí)行不是由程序調用,也不是手工啟動,而是由事件來觸發(fā),例如當對一個表進行操作( insert,delete, update)時就會激活它執(zhí)行。
? ? ? ? 觸發(fā)器經常用于加強數據的完整性約束和業(yè)務規(guī)則等。?觸發(fā)器創(chuàng)建語法四要素:
? ? ? ??1.監(jiān)視地點(table)
? ? ? ? 2.監(jiān)視事件(insert/update/delete)?
? ? ? ? 3.觸發(fā)時間(after/before)?
? ? ? ? 4.觸發(fā)事件(insert/update/delete)
? ? ? ? 觸發(fā)器基本語法如下所示:

其中:trigger_time是觸發(fā)器的觸發(fā)事件,可以為before(在檢查約束前觸發(fā))或after(在檢查約束后觸發(fā));trigger_event是觸發(fā)器的觸發(fā)事件,包括insert、update和delete,需注意對同一個表相同觸發(fā)時間的相同觸發(fā)事件,只能定義一個觸發(fā)器;可以使用old和new來引用觸發(fā)器中發(fā)生變化的記錄內容。
? ? ? ? 觸發(fā)器SQL語法:

  create trigger triggerName
  after/before insert/update/delete on 表名
  for each row #這句話在mysql是固定的
  begin
    sql語句;
  end;

二、簡單的Insert觸發(fā)器

假設存在一張學生表(student),包括學生的基本信息,學號(stuid)為主鍵。

另外存在一張成績表(cj),對應每個學生包括一個值。其中number表示序號為主鍵,自動遞增序列。它在插入過程中默認自增。同時假設成績表中包括學生姓名和學號。

該成績表目前沒有值,先需要設計一個觸發(fā)器,當增加新的學生時,需要在成績表中插入對應的學生信息,至于具體math、chinese、english后面由老師打分更新即可。
? ? ? ? 那么,如何設計觸發(fā)器呢?
? ? ? ? 1.首先它是一個插入Insert觸發(fā)器,是建立在表student上的;
? ? ? ? 2.然后是after,插入后的事件;
? ? ? ? 3.事件內容是插入成績表,主需要插入學生的學號和姓名,number為自增,而成績目前不需要。
? ? ? ? 注意:new表示student中新插入的值。

  create trigger ins_stu
  after insert on student for each row
  begin
    insert into cj ( stu_id, stu_name)
    values( new.stuid, new.username);
  end;

?

然后插入數據:
? ? ? ??insert student values ('eastmount','111111','6','1991-12-05');
同時插入兩個數據,觸發(fā)器正確執(zhí)行了~

注意:創(chuàng)建觸發(fā)器和表一樣,建議增加判斷:DROP TRIGGER IF EXISTS `ins_stu`;

三、判斷值后調用觸發(fā)器

這里簡單講述幾個判斷插入類型的觸發(fā)器。
? ? ? ? 比如觸發(fā)器調用,當插入時間小時為20時,對數據進行插入:

DROP TRIGGER IF EXISTS `ins_info`;
create trigger ins_info
after insert on nhfxelect for each row
begin
  if HOUR(new.RecordTime)='20' then
  insert into nhfxbyhour (UnitDepName, UnitDepCode, ElectCost, TimeJG, RecordTime)
  values( '數統(tǒng)學院', '1', new.USERKWH, '20', new.RecordTime);
end if;
end;

這個觸發(fā)器中,RecordTime為datetime類型,如"2016-08-28 20:10:00",這時hour()這個值為20才能插入;否則數據不能插入。同時可以date_format(new.RecordTime, '%Y-%m-%d')判斷日期為某天或某年某月進行插入。
? ? ? ? 同時,再如更新觸發(fā)器,如果設置的值為某個范圍,才進行操作或性別為"男"或"女"才進行操作。
? ? ? ? 基本語法:
? ? ? ??if 判斷條件?then
? ? ? ? ? ?sql語句;
? ? ? ? end if;

四、Update觸發(fā)器-實時更新

假設存在一個實時插入數據的服務器,例如學生的消費金額或用電量等。
? ? ? ? StuCost:學生的用電數據,實時插入,Cost為每30秒消費金額,RecordTime為每分鐘插入時間,datetime類型;
? ? ? ? StuCostbyHour:統(tǒng)計學生一小時的消費金額,HourCost為金額總數,按小時統(tǒng)計,TimeJD時間段,1~24,對應每小時,RecordTime為統(tǒng)計時間。
? ? ? ? 現在需要設計一個實時更新觸發(fā)器,當插入消費數據時,按小時統(tǒng)計學生的消費金額,同理,用電量等。

DROP TRIGGER IF EXISTS `upd_info`;
create trigger upd_info
after insert on StuCost for each row
begin
update StuCostbyHour set HourCost = HourCost + new.Cost
where (TimeJD = hour(new.RecordTime) + 1) and date_format(new.RecordTime, '%Y-%m-%d') = date_format(RecordTime, '%Y-%m-%d');
end;

SQL語句中,需要獲取插入的時間,然后通過TimeJD時間段和日期RecordTime找到對應的值,然后進行累加即可。如下圖所示:

五、觸發(fā)器盡量避免

問題一:
? ? ? ? ?大型系統(tǒng)必須得要存儲過程和觸發(fā)器嗎? - 知乎
回答1: ? ??? ?
? ? ? ? 我們先要弄清楚二個問題:
? ? ? ??1.什么是大型系統(tǒng)?
? ? ? ??2.你討論的是什么領域的應用,可以大致分為二種:互聯網、企業(yè)內部
? ? ? ? 接下來給你舉一些例子:
? ? ? ? 1.SAP、peopleSoft、ERP等企業(yè)級別應用
? ? ? ? 一般情況下,會使用存儲過程和觸發(fā)器,減少開發(fā)成本,畢竟其業(yè)務邏輯修改頻繁,而且為通用,很多時候會把一些業(yè)務邏輯編寫成存儲過程,像Oracle會寫成包,比存儲過程更強大。
? ? ? ? 另外一個原因是服務器的負載是可控,也即系統(tǒng)的訪問人數首先是可控的,沒有那么大,而且這些數據又非常關鍵,為此往往使用的設備也比較好,多用存儲柜子支撐數據庫。
? ? ? ? 2.另外一類互聯網行業(yè)的
? ? ? ? 比如淘寶、知呼、微博等,數據庫的壓力是非常大的,也往往會最容易成為瓶頸,而且多用PC服務器支撐,用戶量的增速是不可控的,同時在線訪問的用戶量也是不可控的,為此肯定會把業(yè)務邏輯放到其他語言的代碼層,而且可以借助一些LVS等類型軟硬件做負載均衡,以及平滑增減Web層的服務器,從而達到線性的增減而支持大規(guī)模的訪問。
? ? ? ? 所以不管你的這個系統(tǒng)是否龐大,首先要分業(yè)務支持的對象,系統(tǒng)最可能容易出現瓶頸的地方在那?
? ? ? ? 當然也不是說互聯網行業(yè)的應用就絕對不用存儲過程,這個也不對,曾在阿里做的Oracle遷移MySQL系統(tǒng)確實用了,因為歷史的原因,另外還有一些新系統(tǒng)也有用,比如晚上進行定期的數據統(tǒng)計的一些操作,不過有量上的控制。存儲過程是好東西,要分場景,分業(yè)務類型來用就可以把握好。

回答2:
? ? ? ? 肯定不能一刀切的說能用或者不能用,不同類型的系統(tǒng)、不同的規(guī)模、不同的歷史原因都會有不同的解決方案。
? ? ? ? 一般情況下,Web應用的瓶頸常在DB上,所以會盡可能的減少DB做的事情,把耗時的服務做成Scale Out,這種情況下,肯定不會使用存儲過程;而如果只是一般的應用,DB沒有性能上的問題,在適當的場景下,也可以使用存儲過程。
? ? ? ? 至于觸發(fā)器,我是知道有這東西但從來沒用過。我希望風險可控,遇到問題能夠快速的找到原因,盡可能不會去使用觸發(fā)器。

回答3:
? ? ? ? 1.PLSQL可以大大降低parse/exec 百分比;
? ? ? ? 2.存儲過程可以自動完成靜態(tài)SQL variable bind;
? ? ? ? 3.存儲過程大大減少了JDBC網絡傳輸與交互,速度快;
? ? ? ? 4.oracle 中存儲過程內部commit為異步寫,一定程度上減少了等redo日志落地時間;
? ? ? ? 5.存儲過程最大問題就是給數據庫開發(fā)工作壓力太大,另外架構升級時候會比較難解耦;
? ? ? ? 6.觸發(fā)器不推薦使用,觸發(fā)操作能在業(yè)務層解決就在業(yè)務層解決,否則很難維護,而且容易產生死鎖。

問題2:
? ? ? ??為什么大家都不推薦使用MySQL觸發(fā)器而用存儲過程?-?segmentfault
回答1:
? ? ? ? 1.存儲過程和觸發(fā)器二者是有很大的聯系的,我的一般理解就是觸發(fā)器是一個隱藏的存儲過程,因為它不需要參數,不需要顯示調用,往往在你不知情的情況下已經做了很多操作。從這個角度來說,由于是隱藏的,無形中增加了系統(tǒng)的復雜性,非DBA人員理解起來數據庫就會有困難,因為它不執(zhí)行根本感覺不到它的存在。
? ? ? ? 2.再有,涉及到復雜的邏輯的時候,觸發(fā)器的嵌套是避免不了的,如果再涉及幾個存儲過程,再加上事務等等,很容易出現死鎖現象,再調試的時候也會經常性的從一個觸發(fā)器轉到另外一個,級聯關系的不斷追溯,很容易使人頭大。其實,從性能上,觸發(fā)器并沒有提升多少性能,只是從代碼上來說,可能在coding的時候很容易實現業(yè)務,所以我的觀點是:摒棄觸發(fā)器!觸發(fā)器的功能基本都可以用存儲過程來實現。
? ? ? ? 3.在編碼中存儲過程顯示調用很容易閱讀代碼,觸發(fā)器隱式調用容易被忽略。
? ? ? ? 4.存儲過程的致命傷在于移植性,存儲過程不能跨庫移植,比如事先是在mysql數據庫的存儲過程,考慮性能要移植到oracle上面那么所有的存儲過程都需要被重寫一遍。

回答2:
? ? ? ? 這種東西只有在并發(fā)不高的項目,管理系統(tǒng)中用。如果是面向用戶的高并發(fā)應用,都不要使用。
? ? ? ? 觸發(fā)器和存儲過程本身難以開發(fā)和維護,不能高效移植。觸發(fā)器完全可以用事務替代。存儲過程可以用后端腳本替代。

回答3:
? ? ? ? 我覺得來自兩方面的因素:
? ? ? ? 1.存儲過程需要顯式調用,意思是閱讀源碼的時候你能知道存儲過程的存在,而觸發(fā)器必須在數據庫端才能看到,容易被忽略。
? ? ? ? 2.Mysql的觸發(fā)器本身不是很好,比如after delete無法鏈式反應的問題。
? ? ? ? 我認為性能上其實還是觸發(fā)器占優(yōu)勢的,但是基于以上原因不受青睞。


? ? ? ? 最后希望這篇文章對你有所幫助,尤其是學習MySQL觸發(fā)器的同學,你可以通過觸發(fā)器實現一些功能,同時需要注意合理的使用觸發(fā)器,但這個過程需要你不斷的去積累和開發(fā),才能真正理解它的用法和使用場所。

?

轉載于:https://www.cnblogs.com/573734817pc/p/10677509.html

總結

以上是生活随笔為你收集整理的关于mysql触发器和存储过程的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产 一二三四五六 | 亚洲欧美国产一区二区 | 日韩精品一区在线播放 | 高清av网址 | 蜜臀人妻四季av一区二区不卡 | 午夜av在线播放 | 国产一级在线观看视频 | 国产男女无遮挡猛进猛出 | 四虎影像| 色先锋资源网 | 欧美a级黄色 | 操到喷水 | 欧洲成人在线观看 | 国产精品自拍99 | 国产精品入口久久 | 久久精品视频在线播放 | 亚洲一区精品视频在线观看 | 国产在线极品 | 亚洲网站免费看 | 国产一区免费看 | 精品久久久久久久久久久aⅴ | 成年黄色网 | 亚洲你懂得 | 成人在线亚洲 | 国产wwww| 日韩中文三级 | 国内精品卡一卡二卡三 | 国产精品一区在线播放 | 日本学生初尝黑人巨免费视频 | 国产乱码精品一区二区三区精东 | 91av官网| 欧美性猛交ⅹ乱大交3 | 一级片成人 | 亚洲精品天堂网 | 国产精品乱码一区 | 久久这里只有精品6 | 日本一区二区三区在线免费观看 | aa在线视频 | 黄色在线观看视频 | 亚洲福利一区二区 | 免费黄色国产视频 | 国产一级大片 | 欧美性在线观看 | www.天天操| 成人影| 99久久国产宗和精品1上映 | 一道本一区 | 两性囗交做爰视频 | 人人爱人人草 | 4hu在线观看 | 毛片天天看 | 大桥未久av在线播放 | 欧美色图国产精品 | 亚洲午夜久久久久久久久久久 | 国产丝袜美腿一区二区三区 | 欧美精品极品 | 蜜桃成熟时李丽珍国语 | 日韩一区在线观看视频 | 日韩国产一区 | 色婷婷亚洲综合 | 免费看裸体视频网站 | 免费处女在线破视频 | 毛片av免费看 | 国产av无码专区亚洲av毛网站 | 色多多入口 | 深夜福利在线免费观看 | 日本久操 | 女同vk | 精品视频免费 | 最新av电影网站 | 国产精品制服诱惑 | 亚洲精华国产精华精华液网站 | 成年人性视频 | 欧美人一级淫片a免费播放 西方av在线 | 艳母日本动漫在线观看 | 国产又黄又粗又猛又爽 | 国产剧情精品在线 | 麻豆入口 | 影音先锋中文字幕在线视频 | 美女日批视频在线观看 | 中文字幕无码精品亚洲资源网久久 | 久久国产一二三 | 亚洲一区二区三区欧美 | 麻豆福利影院 | 亚洲欧美久久 | 撸撸在线视频 | 精品人妻一区二区三区免费看 | 古典武侠av| 人妖一级片 | 精品国模 | 亚洲av无码成人精品区 | 在线亚洲+欧美+日本专区 | 日本少妇作爱视频 | 91成人毛片| 在线观看1区 | 前任攻略在线观看免费完整版 | av手机免费在线观看 | 欧美国产精品久久 | 亚洲一区二区三区免费在线观看 |