搜尋
首頁資料庫mysql教程对触发器的思考
对触发器的思考Jun 07, 2016 pm 04:06 PM
關於部落格思考觸發觸發器

读到周洲同学的博客,看到一篇关于触发器的文章,是在用户充值时,需要在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之间还可以容得下其他操作,那就没有什么意义了.

我先实验一把,这个空当,就算抛砖引玉了,当然也会默默地、虚心地接受板砖…

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何隐藏文本直到在 Powerpoint 中单击如何隐藏文本直到在 Powerpoint 中单击Apr 14, 2023 pm 04:40 PM

如何在 PowerPoint 中的任何点击之前隐藏文本如果您希望在单击 PowerPoint 幻灯片上的任意位置时显示文本,那么设置起来既快速又容易。要在 PowerPoint 中单击任何按钮之前隐藏文本:打开您的 PowerPoint 文档,然后单击“插入 ”菜单。单击新幻灯片。选择空白或其他预设之一。仍然在插入菜单中,单击文本框。在幻灯片上拖出一个文本框。单击文本框并输入您

2022年十大开源php博客系统有哪些?【推荐】2022年十大开源php博客系统有哪些?【推荐】Jul 27, 2022 pm 05:38 PM

博客,又译为网络日志、部落格或部落阁等,是一种通常由个人管理、不定期张贴新的文章的网站。那么怎么搭建博客?PHP博客系统有哪些?哪个博客系统好用?下面PHP中文网就来给大家总结分享十大开源php博客系统,一起来看看吧!

创建一个简单的博客:使用PHP和SQLite创建一个简单的博客:使用PHP和SQLiteJun 21, 2023 pm 01:23 PM

随着互联网的发展,博客成为越来越多人分享自己生活、知识和想法的平台。如果你也想创建一个自己的博客,那么本文将介绍如何使用PHP和SQLite来创建一个简单的博客。确定需求在开始创建博客之前,我们需要确定自己想要实现的功能。例如:创建博客文章编辑博客文章删除博客文章显示博客文章列表显示博客文章详情用户认证和权限控制安装PHP和SQLite我们需要安装PHP和S

人们是否愿意将他们的思维托付给人工智能?人们是否愿意将他们的思维托付给人工智能?Jan 06, 2024 am 08:44 AM

人们喜欢智能设备,乐于使用人工智能进行计算,也喜欢让人工智能代替人类完成任务,甚至有人想让人工智能来思考。那么,人们是否愿意将自己的思想交给人工智能呢?当然不愿意。虽然人类依靠人工智能可以获得很大的自由,但这种自由和原始人类获得的自由没有太大的区别。原始人类受到自然的威胁,始终对自然界存在敬畏的心态。而到了现在,人类似乎已经征服了自然,但对于人工智能存在严重的依赖。人类会把自己的功能移注到人工智能身上,让人工智能代替人类计算、思考,甚至要人工智能主导人的用餐、出行,还要弄一个集成了人工智能的异性

oracle如何添加触发器oracle如何添加触发器Dec 12, 2023 am 10:17 AM

在Oracle数据库中,您可以使用CREATE TRIGGER语句来添加触发器。触发器是一种数据库对象,它可以在数据库表上定义一个或多个事件,并在事件发生时自动执行相应的操作。

使用Python Django框架构建博客网站使用Python Django框架构建博客网站Jun 17, 2023 pm 03:37 PM

随着互联网的普及,博客在信息传播和交流方面扮演着越来越重要的角色。在此背景下,越来越多的人开始构建自己的博客网站。本文将介绍如何使用PythonDjango框架来构建自己的博客网站。一、PythonDjango框架简介PythonDjango是一个免费的开源Web框架,可用于快速开发Web应用程序。该框架为开发人员提供了强大的工具,可帮助他们构建功能丰

如何使用MySQL的触发器实现数据的自动归档如何使用MySQL的触发器实现数据的自动归档Aug 02, 2023 am 10:37 AM

如何使用MySQL的触发器实现数据的自动归档引言:在现代数据管理领域,数据的自动归档和清理是一个重要而又常见的需求。随着数据量的增加,保留完整的历史数据会占用过多的存储资源,并且会降低查询性能。MySQL的触发器提供了实现这一需求的有效方法。本文将介绍如何使用MySQL的触发器来实现数据的自动归档。一、什么是MySQL的触发器MySQL的触发器是一种特殊的存

mysql的触发器是什么级的mysql的触发器是什么级的Mar 30, 2023 pm 08:05 PM

mysql的触发器是行级的。按照SQL标准,触发器可以分为两种:1、行级触发器,对于修改的每一行数据都会激活一次,如果一个语句插入了100行数据,将会调用触发器100次;2、语句级触发器,针对每个语句激活一次,一个插入100行数据的语句只会调用一次触发器。而MySQL中只支持行级触发器,不支持预语句级触发器。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能