SQL Server 中@@IDENTITY的用法
SQL Server 中@@IDENTITY的用法
SQL Server 中@@IDENTITY的用法用法:
用select @@identity得到上一次插入记录时自动产生的ID
如果你使用存储过程的话,将非常简单,代码如下:SET @NewID=@@IDENTITY
说明:
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。
如果语句和事务失败,它们会更改表的当前标识,从而使标识列中的值出现不连贯现象。即使未提交试图向表中插入值的事务,也永远无法回滚标识值。例如,如果因 IGNORE_DUP_KEY 冲突而导致 INSERT 语句失败,表的当前标识值仍然会增加。
在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函数类似。
@@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。
@@identity实例
USE AdventureWorks;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES ('Damaged Goods', 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS 'Identity';
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO
@@identity使用注意事项:
我们要慎用@@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 是取全局操作的最后一步操作所产生的自增域的值的。
- sqlserver新建表参数错误(Sql Server中判断表、列不存在则创建的方法)
- SQL Server唯一约束
- sqlserver的图形表(SQL Server纵表与横表相互转换的方法)
- sqlserver限制windows身份登录(解决sql server 数据库,sa用户被锁定的问题)
- SQL Server Profile事件含义
- sql server高可用的实现方式(sql server 编译与重编译详解)
- sql server查看之前的代码(SQL Server简单实现数据的日报和月报功能)
- sqlserver 怎么建立触发器(SQL Server:触发器实例详解)
- SQL SERVER数据库状态
- sqlserver怎么显示变量所占字节数(SQL Server中关于基数估计计算预估行数的一些方法探讨)
- sql server2012表的数据删除(SQL Server删除表及删除表中数据的方法)
- sql server中实现split功能
- sqlserver数据库还原教程(SQL Server通过重建方式还原master数据库)
- sql server 进阶(SqlServer AS的用法)
- linux安装sqlserver 2008 r2(Ubuntu 下安装SQL Server教程)
- sql server数据库权限(SQL Server中通用数据库角色权限的处理详解)
- SCI检索 SSCI检索 EI检索 ISTP检索 CSCD检索简介(SCI检索SSCI检索EI检索)
- 参考文献里期刊名称的写法,你知道吗(参考文献里期刊名称的写法)
- 硕博期刊 SCI SSCI CSSCI分不清 一文带你看懂主流期刊分类(硕博期刊SCISSCI)
- 辱华品牌新百伦官宣新代言人IU,个别粉丝希望get爱豆同款(辱华品牌新百伦官宣新代言人IU)
- 巅峰时期被爆床照,曾被选国民最讨厌女星,IU不为人知的黑历史(巅峰时期被爆床照)
- 每天1万吨牛奶倒进下水道,美国大萧条一幕重现(每天1万吨牛奶倒进下水道)
热门推荐
- mysql索引如何使用(MySQL 索引和数据表该如何维护)
- 盘点CSS Selectors Level4中新增的选择器(盘点CSS Selectors Level4中新增的选择器)
- thinkphp实战教程之博客技术学习(python3编写ThinkPHP命令执行Getshell的方法)
- css 三级层级菜单(利用CSS3实现动态的二级三级菜单效果实例源码)
- laravel提取数据库的字段(Laravel创建数据库表结构的例子)
- 织梦dedecms是干啥的(织梦dede去掉后台登陆界面广告的方法)
- php的流程控制语句(php基于 swoole 实现的异步处理任务功能示例)
- css3语法结构(CSS3中的注音对齐属性ruby-align用法指南)
- js函数对象
- 云服务器ecs更换可用区(在阿里云管理控制台重置ECS实例的密码并重启服务器后无法访问该服务器)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9