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 是取全局操作的最后一步操作所产生的自增域的值的。
- sql server没有服务器怎么办(SQL Server 2012安装后服务器名称找不到的解决办法)
- sqlserver连接字符串函数(SQL SERVER 2012新增函数之字符串函数FORMAT详解)
- SQL SERVER 数据库外键
- sqlserverlog原理(sql server中错误日志errorlog的深入讲解)
- sqlserver调试存储过程(sql server2008调试存储过程的完整步骤)
- SQL SERVER中调用存储过程
- Sql Server 更新锁(UPDLOCK)
- SQL SERVER中查看一个数据库的表结构及字段
- sqlserver判断条件输出字符(SQL Server查询条件IN中能否使用变量的示例详解)
- sql server 知识大全(sql server 交集,差集的用法详解)
- sqlserver登录身份验证(SQL Server 2012 身份验证Authentication)
- Sql Server 更新锁
- sqlserver基础数据类型(SQL Server中T-SQL 数据类型转换详解)
- docker部署高性能服务器(Docker部署SQL Server 2019 Always On集群的实现)
- sqlserver索引介绍(浅析SQL Server的聚焦使用索引和查询执行计划)
- sql server建表语句带字段说明(SqlServer给表增加多个字段的语法)
- 越南没事(越南没事情做)
- 重庆旅游攻略(重庆旅游3-4天攻略最佳线路)
- 周杰伦演唱会门票(周杰伦演唱会门票多少钱一张2023)
- 焕然一新 成都轨道集团官方网站改版上线(成都轨道集团官方网站改版上线)
- 成都轨道交通19号线二期全线电通(成都轨道交通19号线二期全线电通)
- 19号线二期全线电通 轨道交通项目最新进展来了(19号线二期全线电通)
热门推荐
- apache服务部署tomcat(Apache与Tomcat服务器整合的基本配置方法及概要说明)
- django连接mysql不支持中文插入(Django创建项目+连通mysql的操作方法)
- mysql事务特性的主要作用(详解MySQL中事务的持久性实现原理)
- js数字时钟编程(JavaScript实现动态数字时钟)
- flash一直在最上方,设置z-index无效
- nodejssocket文件传输(node+socket实现简易聊天室功能)
- 数据库中的事务隔离
- javascript如何转换int型(浅谈JavaScript中的parseInt的妙用)
- python怎么设置matlab编程(实例详解Matlab 与 Python 的区别)
- 常见NoSQL数据库
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9