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书签查找
- sqlserver触发器修改当前字段(利用SQL Server触发器实现表的历史修改痕迹记录)
- sql server日志文件过大怎么办
- sqlserver并发性能(sql server中的任务调度与CPU深入讲解)
- sqlserver连接服务器怎么解决(Sql server端口未打开连接不上的解决方案)
- sqlserver2008数据库的备份(sql server 2008 压缩备份数据库20g)
- sqlserver常用数据结构图(Sql Server数据库常用Transact-SQL脚本推荐)
- SQL Server中row_number的用法
- sqlserver基本知识(sql server学习基础之内存初探)
- sqlserver连接字符串函数(SQL SERVER 2012新增函数之字符串函数FORMAT详解)
- sqlserver字符串判断函数(解决sql server保存对象字符串转换成uniqueidentifier失败的问题)
- sqlserver常用配置调整(sql server性能调优 I/O开销的深入解析)
- 阿里云sql server 2012(远程连接阿里云SqlServer 2012 数据库服务器的图文教程)
- sqlserver最大数据导入量(SQL Server批量插入数据案例详解)
- sqlserver附加数据库时出错(SQL Server数据库附加失败的解决办法)
- sql server性能调优(SQL Server性能调优之缓存)
- 日本菜有什么好吃(日本菜有什么好吃的做法)
- 韩国泡菜做法(韩国泡菜的做法步骤)
- 泰国旅游攻略(泰国旅游攻略必去景点)
- 越难春卷(越难春卷皮怎么用)
- 休闲VS新古典 办公家居简约设计(办公家居简约设计)
- 15个新成 园 位置公布 深圳龙岗2022年共建花园建设又有大动作(15个新成园位置公布)
热门推荐
- mysql主从复制如何解决延迟(MySQL 8.0.23中复制架构从节点自动故障转移的问题)
- laravel完成权限验证(laravel实现Auth认证,登录、注册后的页面回跳方法)
- python计算1到10的阶乘的和(python计算阶乘和的方法1!+2!+3!+...+n!)
- 织梦图集怎么设置(织梦不能上传jpg格式怎么办如何解决)
- dedecms使用手册(dedecms 软件下载模块中添加下载方式为迅雷下载联盟代码)
- iis7如何创建ftp(在win7系统下IIS搭建FTP服务器图文教程介绍)
- dockerswarm滚动部署(使用Docker部署war包项目的实现)
- electronvue最新版本(Vue3和Electron实现桌面端应用详解)
- docker网络通信(Google和Facebook不使用Docker的原理解析)
- sql对象资源管理在哪(SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9