MySQL觸發(fā)器的使用和inserted和deleted表介紹
背景
最近在項目中有需求是當人員表中有變動時(比如:增加人員、修改人員信息、刪除人員信息)需要把這張表中的變動的信息同步到它對應的日志表中。那么如果用代碼寫邏輯的話在執(zhí)行效率上會比較慢,正好sqlserver提供了觸發(fā)器,我們可以利用觸發(fā)器進行解決這個問題。
什么時sqlserver觸發(fā)器
觸發(fā)器是在對表進行插入、更新或刪除操作時自動執(zhí)行的特殊存儲過程。觸發(fā)器通常用于強制業(yè)務規(guī)則,觸發(fā)器是一種高級約束,可以定義比CHECK約束更為復雜的約束:可以執(zhí)行復雜的SQL語句(if/while/case),可以引用其他表中的列。觸發(fā)器定義在特定的表上,與表相關,自動觸發(fā)執(zhí)行,不能直接調(diào)用,是一個事務(可回滾)。
觸發(fā)器的種類
觸發(fā)器是在對表進行增、刪、改操作才能夠觸發(fā)觸發(fā)器。這里分為after(之后)和instead of(之前)觸發(fā)。after觸發(fā)器要求只有執(zhí)行某一操作(insert、update、delete)之后觸發(fā)器才能被觸發(fā),且只能定義在表上。而instead of觸發(fā)器表示并不執(zhí)行其定義的操作(insert、update、delete)而僅是執(zhí)行觸發(fā)器本身,其優(yōu)先級高于觸發(fā)語句的執(zhí)行。
觸發(fā)器的使用
以下內(nèi)容介紹after之后的觸發(fā)器。以navicat工具為例。
首先我們需要監(jiān)測哪個數(shù)據(jù)庫就在哪個數(shù)據(jù)庫創(chuàng)建觸發(fā)器。比如:需要監(jiān)聽人員表中的數(shù)據(jù)變化,那么就需要在人員表中添加觸發(fā)器。點擊表的設計,找到觸發(fā)器

在上方點擊添加觸發(fā)器,并設置觸發(fā)器的名稱以及觸發(fā)的時間和在什么情況下觸發(fā)。

設置完這些之后可以去寫邏輯

首先介紹一下sql觸發(fā)器中兩個表,inserted和deleted。可以理解為這兩張表是臨時表,它的表字段和在哪個表中創(chuàng)建觸發(fā)器的字段是一致的,比如:我在人員管理表中添加了觸發(fā)器,那么inserted表和deleted表中的字段是一致的。這兩張表是系統(tǒng)在內(nèi)存中創(chuàng)建的兩張表,不會存儲到數(shù)據(jù)庫中,且這兩張表是只讀的,不能修改數(shù)據(jù)。當觸發(fā)器完成工作之后,這兩張表也會被刪除
| 表操作 | inserted表 | deleted表 |
| insert | 存放新增的記錄 | 無 |
| update | 存放新增的記錄 | 存放更新前的數(shù)據(jù) |
| delete | 無 | 存放新增的數(shù)據(jù) |
舉例:
BEGIN -- if EXISTS (select * from deleted) //判斷deleted表中是否有數(shù)據(jù) declare @is_delete char(20) //定義變量 if EXISTS( select is_delete from inserted ) declare @userId varchar(20) declare @userName VARCHAR(20) declare @machineId VARCHAR(40) declare @operator_Id VARCHAR(20) declare @operator varchar(20) select @is_delete=is_delete,@userId=user_id,@userName=user_name,@machineId=machine_id,@operator_Id=update_user_id,@operator=update_user_name FROM inserted //給變量賦值 IF @is_delete=1 判斷條件 BEGIN insert into User_Management_Logs(user_id,user_name,act,machine_id,operator,operator_id) VALUES(@userId,@userName,'刪除用戶',@machineId,@operator,@operator_Id) //在哪張表中插入數(shù)據(jù) END END
到此這篇關于MySQL觸發(fā)器的使用和inserted和deleted表介紹的文章就介紹到這了,更多相關MySQL觸發(fā)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL8.0.3 RC版即將發(fā)布 先來看看有哪些變化
MySQL8.0.3 RC版即將發(fā)布,這篇文章主要介紹了MySQL8.0.3 RC版的一些新變化,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09
MySQL查詢性能優(yōu)化的7個常見查詢錯誤及解決方案
數(shù)據(jù)庫性能是Web應用和大型軟件系統(tǒng)穩(wěn)定運行的關鍵,即使是精心設計的應用,如果數(shù)據(jù)庫查詢效率低下,也會導致用戶體驗下降、系統(tǒng)資源浪費,甚至系統(tǒng)崩潰,本文將深入探討MySQL查詢優(yōu)化,分析常見的查詢錯誤,并提供提升數(shù)據(jù)庫性能的實用技巧,需要的朋友可以參考下2025-04-04
IOS 數(shù)據(jù)庫升級數(shù)據(jù)遷移的實例詳解
這篇文章主要介紹了IOS 數(shù)據(jù)庫升級數(shù)據(jù)遷移的實例詳解的相關資料,這里提供實例幫助大家解決數(shù)據(jù)庫升級及數(shù)據(jù)遷移的問題,需要的朋友可以參考下2017-07-07
mysql創(chuàng)建的外鍵無法保存的原因以及處理辦法
這篇文章主要介紹了mysql創(chuàng)建的外鍵無法保存的原因以及處理辦法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
PHP使用mysqli擴展連接MySQL數(shù)據(jù)庫
這篇文章主要介紹了PHP使用mysqli擴展連接MySQL數(shù)據(jù)庫,需要的朋友可以參考下2014-08-08

