对触发器的思考
读到周洲同学的博客,看到一篇关于触发器的文章,是在用户充值时,需要在t_reCharge表中插入一条记录,同时更新t_card表以保证数据一致性.我们当时没想特别多,没想到触发器,就是写了多条sql语句,为了不出错后来使用了事务或存储过程,没记错的话是放在存储过程里
读到周洲同学的博客,看到一篇关于触发器的文章,是在用户充值时,需要在t_reCharge表中插入一条记录,同时更新t_card表以保证数据一致性.我们当时没想特别多,没想到触发器,就是写了多条sql语句,为了不出错后来使用了事务或存储过程,没记错的话是放在存储过程里了。她是这么实现的:
"recharge表中保证提取的是最新一条充值记录,card表中保证更新的记录满足卡号等于充值卡号。"
<spanstyle="font-family:FangSong_GB2312;">CREATETRIGGER[dbo].[CardCash] on [dbo].[T_Recharge] for Insert AS BEGIN UPDATE T_Card set sCash =sCash +(select top 1 rAdd fromT_Recharge order by rNo desc) WhereT_Card .cNo in (select top 1 cNo fromT_Recharge order by rNo desc ) END</span>
原文链接如下:
给D层减负-存储过程与触发器的使用
看到这儿,心里挺佩服小师妹的,不过我还有两个问题:
1. sql语句是硬伤,我可不可以传参呢?
2. 如果有两个卡同时充值,会不会查询到的t_reCharge最新记录是另一个卡的?换句话说,update和insert孰先孰后?其实我一直也没想明白两个卡同时充值到底先插入哪条记录?
3. 如果2中的触发器本身就是事务,保证了要么都执行要么都不执行,就没有这个问题.否则,是不是考虑加上事务呢?
接下来进一步了解了触发器的工作原理。
由于使表中数据发生变化的操作有插入、更新和删除,所以触发器可以分为三类:INSERT触发器、UPDATE触发器和DELETE触发器。
1.INSERT触发器
当试图向表中插入记录时,INSERT触发器(如果有)自动执行,此时系统自动创建一个inserted表,新的记录被添加到触发器表和inserted表。触发器可以检查inserted表,确定是否执行触发器动作和如何执行触发器动作。
2.DELETE触发器
当试图从表中删除信息时,DELETE触发器被触发,此时系统自动创建一个deleted表,被删除的行被放置到这个特殊的表中。被删除的行在触发器表中将不再存在。因此,触发器表和deleted表之间没有共同的记录。
3.UPDATE触发器
UPDATE语句可以看成两步,删除一条旧记录,插入一条新记录。所以,UPDATE触发器被触发时,自动创建一个deleted表和一个inserted表,UPDATE语句使原始行移入deleted表,将更新行插入到inserted表中。
我们这里是一个insert触发器,那为什么用触发器?用一个类似的例子来解释。我们有两个表用来记录商品的出库入库情况,t_good_store记录库存的产品类别和数量,而t_good_out记录出库的产品类别和数量,那么每当我们出库的某个类别的产品一定数量的时候,我们应该在t_good_out中插入该产品的类别和出库数量,同时也应该在t_good_store中用update来更新库存的相应类别的产品的数量;这时我们要完成两个任务:插入t_good_out后更新t_good_store,为避免只操作其中一个而造成数据的不一致,我们可以用触发器,在t_good_out的插入操作上绑定一个对t_good_store更新的触发器。当然这个过程应该是一个事务,这就不必担心插入t_good_out表执行了,而绑定在这个动作上的触发器操作不会执行,因为数据库设计了原子性。
再来看上面的三个问题.
1. 触发器只有在修改(包括插入和删除)时触发,目的是给我们一个做其他动作的机会,它没有在查询数据时做其他动作的能力.问了触发器是否有参数这个问题,说明我刚开始没有理解触发器的这个特性.
另外,根据触发器的工作原理,我们可以访问inserted和deleted这两张临时表,需要明白的是inserted存放进行insert和update操作后的数据;deleted存放进行delete和update操作前的数据.
Update=delete+insert.这一点给我们的启示:DRP系统中有一个页面是修改Item或者client或者flowCard,可以先都删除再都插入,然后提示修改成功,不然那个样子多的条目,如何一条条判断再modify?
2. 关于同时插入两个记录,有人说可以,因为insert是在毫秒级,但是不管什么级都是有先有后啊.又说,insert是rowlevel锁,如果不Lock table的话,也无法确定先后啊.
3. 我认为可以不加事务,触发器要是设计得insert和update之间还可以容得下其他操作,那就没有什么意义了.
我先实验一把,这个空当,就算抛砖引玉了,当然也会默默地、虚心地接受板砖…

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在iOS17和iPadOS17中,Apple在iPhone和iPad上引入了類似Message的FaceTime反應。除了不是從選單中選擇圖示之外,您還可以在FaceTime通話中透過實體手勢觸發它們。當您在運行iOS17的iPhone或運行iPadOS17的iPad上進行FaceTime視訊通話時,您可以觸發心形、氣球、五彩紙屑、煙火等屏幕效果,視覺效果會在您的FaceTime通話視頻中充斥顯示屏,有時非常壯觀,供其他人觀看。您可以解放雙手,只需使用物理手勢即可觸發這些反應。例如,一個豎起大拇趾

從零開始,手把手教你安裝Flask和快速建立個人部落格作為一個喜歡寫作的人來說,擁有個人部落格是非常重要的。而Flask作為一個輕量級的PythonWeb框架,可以幫助我們快速建立一個簡潔而功能完善的個人部落格。在本文中,我將從零開始,手把手教你如何安裝Flask並快速建立個人部落格。第一步:安裝Python和pip在開始之前,我們需要先安裝Python和pi

隨著網路的發展,部落格成為越來越人分享自己生活、知識和想法的平台。如果你也想創建一個自己的博客,那麼本文將介紹如何使用PHP和SQLite來創建一個簡單的博客。在確定需求在開始創建部落格之前,我們需要確定自己想要實現的功能。例如:建立部落格文章編輯部落格文章刪除部落格文章顯示部落格文章清單顯示部落格文章詳情使用者認證和權限控制安裝PHP和SQLite我們需要安裝PHP和S

在macOSSonoma中,Apple為FaceTime引入了類似訊息的反應。不過,它們不是由文字觸發,而是可以透過手勢觸發。當您在運行macOSSonoma或更高版本的Mac上進行FaceTime視訊通話時,您可以觸發心形、氣球、五彩紙屑、煙火等螢幕效果,這些效果會淹沒FaceTime通話視窗上的顯示器。您可以透過綠色的FaceTime選單欄項目觸發這些圖層螢幕效果,其中包括迷你網路攝影機視圖和觸發反應的按鈕,或者您可以解放雙手並僅使用實體手勢觸發相同的反應。例如,一個豎起大拇指觸發一個贊,兩個

博客,又譯為網絡日誌、博客或部落閣等,是一種通常由個人管理、不定期張貼新的文章的網站。那怎麼搭建部落格? PHP部落格系統有哪些?哪個部落格系統好用?下面PHP中文網就來跟大家總結分享十大開源php部落格系統,一起來看看吧!

如何在 PowerPoint 中的任何點擊之前隱藏文本如果您希望在單擊 PowerPoint 幻燈片上的任意位置時顯示文本,那麼設置起來既快速又容易。若要在 PowerPoint 中按一下任何按鈕之前隱藏文字:開啟您的 PowerPoint 文檔,然後按一下「插入 」功能表。點選新幻燈片。選擇空白或其他預設之一。仍然在插入選單中,按一下文字方塊。在投影片上拖出一個文字方塊。點擊文字方塊並輸入您

在iOS17中,Apple在FaceTime中引入了類似訊息的反應。不過,它們不是由文字觸發,而是可以透過手勢觸發。當您在運行iOS17的iPhone上進行FaceTime視訊通話時,您現在可以觸發心形、氣球、五彩紙屑、煙火等螢幕效果,這些效果會淹沒FaceTime通話視窗上的顯示器。您可以透過在FaceTime中長按圖片來觸發這些圖層螢幕效果,這會彈出反應選項選單,或者您可以解放雙手並僅使用實體手勢觸發相同的反應。例如,一個豎起大拇指觸發一個贊,兩個豎起大拇指是煙火。同樣,一個大拇指向下算作不

事件冒泡為何會觸發兩次?事件冒泡(EventBubbling)是指在DOM中,當一個元素觸發了某個事件(例如點擊事件),該事件會從該元素開始向上冒泡至父元素,直到冒泡到最頂層的文檔對象為止。事件冒泡是DOM事件模型的一部分,它允許開發者將事件監聽綁定到父元素,從而在子元素觸發事件時,可以透過冒泡機制來捕獲並處理事件。然而,有時開發者會遇到事件冒泡觸發兩次的
