Sqlserver @@IDENTITY 和 SCOPE_IDENTITY() 的使用
为啥单独写这个呢. 有个系统用了7年 好好的 没点问题.今天早上正在愉快搬砖中. 突然 邮件满天飞.说提交数据出问题了. 一看错误.主键重复. 我主键是自增的怎么重复呢 , 背景是主表为A表/从表为B 表 在A表产生一个自增值 然后作为主键插入到B表. 我直接 在数据库测试插入个人习惯 用 SCOPE_IDENTITY() 没有问题 , 最后检查代码发现.获取A表自增的时候 使用的是 @@IDENTITY, 随后改掉正常了
问题产生的原因就要从 这两个获取当前 会话的自增的规则来讲了
SCOPE_IDENTITY() 只返回插入到当前作用域中的值
@@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值
而在我刚刚的问题中. 产生的原因就是同事在 A表中加了个触发器在A插入数据时同时在另一个有自增的表插入一条数据, 按上面的规则 @@IDENTITY 返回当前会话的 不管是哪个地方的. 所以它返回了触发器里插入另一个表时产生的自增值, 而 SCOPE_IDENTITY 对于当前的作用域来说 触发器里的事情已经超出它的域了所以是不管的.就能正确返回.
因为 日常返回自增时按使用情况 决定用哪一个 不要盲目的使用 @@IDENTITY