@@IDENTITY 的缺点 SCOPE_IDENTITY() 取而代之

2024-03-12 09:58

本文主要是介绍@@IDENTITY 的缺点 SCOPE_IDENTITY() 取而代之,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 也许大家对SQL Server中的 @@IDENTITY 都不陌生,都知道它是获取数据表中最后一条插入数据的IDENTITY值。
 比如,表 A 中有个 ID 为自增1的字段,假设此时 ID 的值为100,现在如果我往表A插入一条数据,并在插入后 
 SELECT @@IDENTITY,则其返回 101,最后一条IDENTITY域(即ID域)的值。
 
 现在问题来了,为什么说要慎用@@IDENTITY呢?原因是 @@IDENTITY 它总是获取最后一条变更数据的自增字段的值,
 而忽略了进行变更操作所在的范围约束。比如,我有表 A 和表 B 两个表,现在我在表 A 上定义了一个Insert触发器,
 当在表 A 中插入一条数据时,自动在表 B 也插入一条数据。此时,大家注意,有两个原子操作:在A中插入一条数据, 接着在B中随后插入一条数据。
 
 现在我们想下,假设上面表 A 和表 B 都有IDENTITY自增域,那么我们在表 A 插入一条数据后,使用了 
 SELECT @@IDENTITY 输出时,输出的到底是 A 还是 B 的自增域的值呢?  答案很明显,是谁最后插入就输出谁,
 那么就是 B 了。于是,我本意是想得到 A 的自增域值,结果得到了 B 的自增域值,一只 BUG 随之诞生,搞不好还
 会影响到整个系统数据的混乱。
 
 因此,对于这种情况,建议大家慎用 @@IDENTITY,而尽量采用 SCOPE_IDENTITY() 函数替换之。SCOPE_IDENTITY() 
 也是得到最后一条自增域的值,但是它是仅限在一个操作范围之内,而不像 @@IDENTITY 是取全局操作的最后一步操作
 所产生的自增域的值的。
 

这篇关于@@IDENTITY 的缺点 SCOPE_IDENTITY() 取而代之的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800897

相关文章

【mysql 存储过程】应用存储过程的优点与缺点

总结下使用存储过程的优缺点 一、存储过程优点 存储过程是一组预先创建并用指定的名称存储在数据库服务器上的 SQL 语句,将使用比较频繁或者比较复杂的操作,预先用 SQL 语句写好并存储起来,以后当需要数据库提供相同的服务时,只需再次执行该存储过程。 1.具有更好的性能 存储过程是预编译的,只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,因

PostgreSQL 报错 because it does not have a replica identity and publishes updates

(update,delete触发,insert不触发)because it does not have a replica identity and publishes updates Hint: To enable updating from the table, set REPLICA IDENTITY using ALTER TABLE 如果相关表涉及了逻辑复制,且对应表没有主键,则需要

数据库索引的作用优点和缺点

为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能。  第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。  第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。  第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。  第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。  第五,通过使用索引,可以在

java并发编程(5)--CAS是什么 底层原理 缺点

一、CAS是什么?   看下⾯代码进⾏思考,此时number前⾯是加了volatile关键字修饰的,volatile不保证原⼦性,那么使 ⽤AtomicInteger是如何保证原⼦性的? 这⾥的原理是什么?CAS   class MyData {volatile int number = 0;AtomicInteger atomicInteger = new AtomicIntege

NLP-生成模型-2014:Seq2Seq【缺点:①解码器无法对齐编码器(Attention机制);②编码器端信息过使用或欠使用(Coverage机制);③解码器无法解决OOV(Pointer机制)】

《原始论文:Sequence to Sequence Learning with Neural Networks》 Seq2Seq模型是将一个序列信号,通过“编码&解码”生成一个新的序列信号,通常用于机器翻译、语音识别、自动对话等任务。 Seq2Seq(多层LSTM-多层LSTM)+Attention架构是Transformer提出之前最好的序列生成模型。 我们之前遇到的较为熟悉的序列问题,

深入理解JavaScript系列(14):作用域链(Scope Chain)

前言 在第12章关于变量对象的描述中,我们已经知道一个执行上下文 的数据(变量、函数声明和函数的形参)作为属性存储在变量对象中。 同时我们也知道变量对象在每次进入上下文时创建,并填入初始值,值的更新出现在代码执行阶段。 这一章专门讨论与执行上下文直接相关的更多细节,这次我们将提及一个议题——作用域链。 英文原文:http://dmitrysoshnikov.com/ecmascr

《AngularJS》——scope的绑定策略

scope这个对象在Angular中非常重要,可以说要想学好AngularJS,熟练使用Scope时基本功,下面介绍一下Scope的几种绑定策略。   1、@:把当前的属性作为字符串传递。你还可以绑定来自外层的scope的值,在属性值中插入{{}}即可。下面是代码。 <!DOCTYPE html><html ng-app="MyModule"><head><meta charse

tf.identity 和 tf.control_dependencies的用法

关于 tf.control_dependencies(具体参考博客,也是本文主要参考对象): tf.control_dependencies(control_inputs)设计是用来控制计算流图的,给图中的某些计算指定顺序。比如:我们想要获取参数更新后的值,那么我们可以这么组织我们的代码。 opt = tf.train.Optimizer().minize(loss)with tf.contr

np.identity和np.eye

numpy.identity(n, dtype=None) >>> np.identity(3)array([[ 1., 0., 0.],[ 0., 1., 0.],[ 0., 0., 1.]]) numpy.eye(N, M=None, k=0, dtype=< class ‘float’>, order=’C’) Parameters: N : int 行数 M : i

当 IDENTITY_INSERT 设置为 OFF 时,不能向表 ‘users‘ 中的标识列插入显式值

问题描述: 在向SQL Server数据库插入数据时,遭遇“ 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'users' 中的标识列插入显式值。”错误! 插入的SQL语句: INSERT INTO USERS( UserID,UserName,UserPwd,Sex,Question,Answer,User_Level,RoleID,LoginTimes,