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触发器编写教程(SQL Server 使用触发器trigger发送电子邮件步骤详解)
- sqlserver表值函数用法(SQL Server数据库中的表名称、字段比较)
- sqlserver两表查询语句格式(sql server实现在多个数据库间快速查询某个表信息的方法)
- SQL Server 批量导入数据的方法
- sqlserver表分区缺点(SQL Server 公用表表达式CTE实现递归的方法)
- Sql Server 更新锁
- python操作sql server数据库(Python 数据库操作 SQLAlchemy的示例代码)
- sqlserver分组查询(sql server如何利用开窗函数over进行分组统计)
- sql server还原数据库时提示数据库正在使用
- sqlserver快照表(详解SQL Server 2016快照代理过程)
- sql server事件跟踪器中常用的跟踪事件
- sql server 共享锁
- sql server中dense_rank和row_number的区别
- sqlserver附加数据库时出错(SQL Server数据库附加失败的解决办法)
- 无法启动sql serveragent(SQL Agent服务无法启动的解决方法)
- sqlserver 比较日期(解析SQL Server中SQL日期转换出错的原因)
- Beyond 版本《无人深空》主线任务攻略 阿特拉斯之道(版本无人深空主线任务攻略)
- 全球科技界最有钱大佬TOP 15 你知道几位(全球科技界最有钱大佬TOP)
- 2主力后腰缺阵 泰山队奇兵有望获重用,赛季0出场,迎来中超首秀(泰山队奇兵有望获重用)
- 三分71 生死战爆发 篮网旧将丁威迪今天成奇兵,助队赢球(三分71生死战爆发)
- 《红 雄安》系列广播剧第一集 水上奇兵雁翎队(雄安系列广播剧第一集)
- 小说 小伙穿越成刘备,用现代知识指挥作战,众谋士都看呆了(小伙穿越成刘备)
热门推荐
- h5怎么在微信公众号发布(H5微信公众号授权的简单实现步骤)
- html5做app流程(Html5嵌入钉钉的实现示例)
- javascript如何建立一个静态变量(JavaScript中子函数访问外部变量的3种解决方法)
- 织梦cms内容模型管理详解(织梦CMS系统TAG标签页面包屑导航的调用方法)
- 个人能备案云服务器吗(租用云服务器后的备案问题你真的了解吗?)
- mysql中怎么删除整张表(MySQL如何优雅的删除大表实例详解)
- nginx服务器和apache服务器(Nginx vs Apache两大web服务器比较)
- python itchat库介绍(Python利用itchat库向好友或者公众号发消息的实例)
- , , 的区别
- vue中怎么触发复选框的点击事件(vue点击弹窗自动触发点击事件的解决办法模拟场景)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9