预备知识:SQLServer的IDENTITY关键字

IDENTITY关键字代表的是一个函数,而不是identity属性。在access里边没有这个函数,所以在access不能用这个语句。语法:identity

(数据类型,标识种子,标识增长量)

举例:select identity (数据类型,标识种子,标识增长量) AS 列名 into 新表 from 原表名

每个表都可以有一个自动增长列,众所周知的就是IDENTITY列。一个IDENTITY列总是被当作表的主键处理(因此,多列主键不可能有一个IDENTITY列)。并且从中可看出,我们很容易指定从什么数开始,增幅是多少。

SQLServer中@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的作用

相同点:

它们都返回插入到IDENTITY列中的值。

不同点:

A.

@@IDENTITY不受作用域(存储过程、触发器、函数或批处理)的限制。返回最后一个插入的IDENTITY值。如果在程序中不同的作用域插入的表不同,那么返回最后一个表插入的IDENTITY值。例如:作用域A(存储过程)在表T1上插入IDENTITY列,而T1上的触发器会在T2上插入IDENTITY列。则用@@IDENTITY返回T2上插入的IDENTITY值。举例:

下面的示例向带有标识列的表中插入一行,并用@@IDENTITY 显示在新行中使用的标识值。

程序代码

Insert INTO jobs (job_desc,min_lvl,max_lvl)

VALUES ('Accountant',12,125)

Select @@IDENTITY AS 'Identity'

B.

SCOPE_IDENTITY()受作用域的限制,只返回当前作用域中的最后一个IDENTITY值。上例中,如果在存储过程中使用SCOPE_IDENTITY(),则返回T1的IDENTITY值。

C.

IDENT_CURRENT()不受作用域的限制,调用它时必须提供表示表名的字符型参数,你可以得到你想要的任何表的最后一个IDENTITY值,即使你的代码里没有插入动作。例如:IDENT_CURRENT('T1');

经验:

比如,表 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(),因为它和当前会话相关联,不会返回一个你不需要的值。如果你仅仅想得到某个IDENTITY列的最后一个值,则使用

IDENT_CURRENT()最方便。

oracle select @@identity,SQL区别@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT相关推荐

  1. Sql Server插入数据并返回自增ID,@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的区别

    预备知识:SQLServer的IDENTITY关键字 IDENTITY关键字代表的是一个函数,而不是identity属性.在access里边没有这个函数,所以在access不能用这个语句.语法:ide ...

  2. mysql ident current_sql server 2000 @@IDENTITY和SCOPE_IDENTITY和IDENT_CURRENT的区别

    @@IDENTITY和SCOPE_IDENTITY和IDENT_CURRENT的区别 1,@@IDENTITY是得到当前会话的所有范围的最后插入的IDENTITY值 2,SCOPE_IDENTITY是 ...

  3. @@identity、scope_identity()、IDENT_CURRENT('tablename')函数的区别

    @@IDENTITY 和SCOPE_IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值.但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值:@@IDENTITY 不受限于 ...

  4. SCOPE_IDENTITY和@@identity的区别

    SCOPE_IDENTITY.IDENT_CURRENT 和 @@IDENTITY 是相似的函数,因为它们都返回插入到标识列中的值. IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的 ...

  5. SQL Server 和 Oracle 以及 MySQL 的区别

    SQL Server 和 Oracle 以及 MySQL 的区别 历史说明区别 > Oracle: 中文译作甲骨文,成立于1977年,早期的理论基础,反而来自于一篇IBM的论文<A Rel ...

  6. oracle类型sql转为mysql_Oracle和MySql之间SQL区别(等效转换以及需要注意的问题)...

    >本篇博文是Oracle和MySQL之间的等效SQL转换和不同,目前市面上没有转换两种SQL的工具,小编觉得以后也不一定会有,于是在业余时间整理了一下,如果有什么错误之处请留言告知,小编也是刚 ...

  7. mysql identity sql,SQL Server的Identity字段使用/复制/重设

    SQL Server的Identity字段使用/复制/重设 在数据库中, 常用的一个流水编号通常会使用 identity 字段来进行设置, 这种编号的好处是一定不会重复, 而且一定是唯一的, 这对ta ...

  8. oracle stdevp函数,SQL Server与oracle两者区别之函数区别

    Oracle和SQL Server的常用函数对比 1.数学函数 ①绝对值 S:select abs(-1) value O:select abs(-1) value from dual ②取整(大) ...

  9. 关于numpy中eye和identity的区别详解

    https://www.jb51.net/article/175386.htm np.identity(n, dtype=None) np.eye(N, M=None, k=0, dtype=< ...

最新文章

  1. log4j 源码解析_log4j1.x设置自动加载log4j.xml
  2. @property与@synthesize的差别
  3. 基于ABP落地领域驱动设计-05.实体创建和更新最佳实践
  4. html视频位置控制器,html5中返回音视频的当前媒体控制器的属性controller
  5. LeetCode 187. 重复的DNA序列
  6. oracle中直方图的使用
  7. 有关判读flex 模板载入是否结束的一些问题。
  8. dell设置从ssd启动_工程师笔记︱趁降价采购了一批SSD,结果管理上遇到了问题?...
  9. 程序员提升编码技能的秘密
  10. java实训致谢_Java教学实习报告(最终版).doc
  11. 企业oa系统是什么,有什么好用的办公软件推荐?
  12. 004 ZeroMQ PUB XSUB-XPUB SUB模式
  13. 微信新版本文件乱保存自用解决方法
  14. 152、全面图解交换机接口及连接
  15. 基于三周加速度传感器的计步器设计
  16. 硬盘存储结构及分区简介
  17. 把代码字体加大的办法
  18. FANUC机器人6点示教法设定工具坐标系的具体步骤
  19. 如何利用编程思维,提高英语成绩?
  20. 下载 axios.js 文件到本地

热门文章

  1. [8] Replace the Numbers
  2. 快速搭建一个本地服务器(http-server)
  3. 扫地机器人作文说明文提纲_扫地机器人说明文800字
  4. 专利申请文件有哪些?专利撰写有什么技巧?
  5. Rotated FCOS
  6. Selenium自动填写问卷星
  7. SolidWorks安装后别着急用,这八个重要SolidWorks设置可以提高你的画图效率
  8. Easyui中input标签设置只读
  9. 手把手教你solidworks中的齿轮配合
  10. 【算法笔记】反转二叉树