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

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

設(shè)置完這些之后可以去寫邏輯

首先介紹一下sql觸發(fā)器中兩個(gè)表,inserted和deleted??梢岳斫鉃檫@兩張表是臨時(shí)表,它的表字段和在哪個(gè)表中創(chuàng)建觸發(fā)器的字段是一致的,比如:我在人員管理表中添加了觸發(fā)器,那么inserted表和deleted表中的字段是一致的。這兩張表是系統(tǒng)在內(nèi)存中創(chuàng)建的兩張表,不會(huì)存儲(chǔ)到數(shù)據(jù)庫(kù)中,且這兩張表是只讀的,不能修改數(shù)據(jù)。當(dāng)觸發(fā)器完成工作之后,這兩張表也會(huì)被刪除
| 表操作 | 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
到此這篇關(guān)于MySQL觸發(fā)器的使用和inserted和deleted表介紹的文章就介紹到這了,更多相關(guān)MySQL觸發(fā)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
庫(kù)名表名大小寫問題與sqlserver兼容的啟動(dòng)配置方法
庫(kù)名表名大小寫問題與sqlserver兼容的啟動(dòng)配置方法,需要的朋友可以參考下。2010-12-12
MySQL8.0.3 RC版即將發(fā)布 先來看看有哪些變化
MySQL8.0.3 RC版即將發(fā)布,這篇文章主要介紹了MySQL8.0.3 RC版的一些新變化,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
MySQL查詢性能優(yōu)化的7個(gè)常見查詢錯(cuò)誤及解決方案
數(shù)據(jù)庫(kù)性能是Web應(yīng)用和大型軟件系統(tǒng)穩(wěn)定運(yùn)行的關(guān)鍵,即使是精心設(shè)計(jì)的應(yīng)用,如果數(shù)據(jù)庫(kù)查詢效率低下,也會(huì)導(dǎo)致用戶體驗(yàn)下降、系統(tǒng)資源浪費(fèi),甚至系統(tǒng)崩潰,本文將深入探討MySQL查詢優(yōu)化,分析常見的查詢錯(cuò)誤,并提供提升數(shù)據(jù)庫(kù)性能的實(shí)用技巧,需要的朋友可以參考下2025-04-04
MySQL數(shù)據(jù)庫(kù)升級(jí)的一些"陷阱"
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)升級(jí)需要注意的地方,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08
IOS 數(shù)據(jù)庫(kù)升級(jí)數(shù)據(jù)遷移的實(shí)例詳解
這篇文章主要介紹了IOS 數(shù)據(jù)庫(kù)升級(jí)數(shù)據(jù)遷移的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例幫助大家解決數(shù)據(jù)庫(kù)升級(jí)及數(shù)據(jù)遷移的問題,需要的朋友可以參考下2017-07-07
mysql創(chuàng)建的外鍵無法保存的原因以及處理辦法
這篇文章主要介紹了mysql創(chuàng)建的外鍵無法保存的原因以及處理辦法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
PHP使用mysqli擴(kuò)展連接MySQL數(shù)據(jù)庫(kù)
這篇文章主要介紹了PHP使用mysqli擴(kuò)展連接MySQL數(shù)據(jù)庫(kù),需要的朋友可以參考下2014-08-08

