@@IDENTITY 是否总能保证插入语句执行后的ID是正确的?

来源:互联网 发布:二手玫瑰 知乎 编辑:程序博客网 时间:2024/05/17 02:14

这两天CSDNBlog问题不断啊!今天venjiang老大忙里偷闲去群里骂我们, 搞了个难题考我们。出题如下:

@@IDENTITY 是否总能保证插入语句执行后的ID是正确的?(这描述的不清晰哦,云里雾里的揣摩老大的意思ing....)

我想了想(因为我们一直使用inser into table ,select @@IDENTITY 这样的语句返回插入的数据ID,并且从没碰到过返回的ID与数据不匹配的情况),说:能,没碰到过不正确的时候!

venjiang接着说:如果数据访问很频繁,会不会出现我这边执行时,返回的是你那边插入的ID?

我想了一下说:不会。

venjiang就给我发了一段:@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 是相似的函数,因为他们都返回插入到表的 IDENTITY 列的最后一个值。

@@IDENTITY 和 SCOPE_IDENTITY 可以返回当前会话中的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。

细细一看,感觉使用@@IDENTITY还真没准会出现venjiang说的那种情况!

接着venjiang给我发了一个触发器:(不巧插入代码有错误,只好直接粘贴代码了)

CREATE TABLE t6(id int IDENTITY);
CREATE TABLE t7(id int IDENTITY(100,1));
GO
CREATE TRIGGER t6ins ON t6 FOR INSERT
AS
BEGIN
   INSERT t7 DEFAULT VALUES
END;
GO
--End of trigger definition

SELECT   * FROM t6;
--id is empty.

SELECT   * FROM t7;
--ID is empty.

--Do the following in Session 1
INSERT t6 DEFAULT VALUES;
SELECT @@IDENTITY;
/*Returns the value 100. This was inserted by the trigger.*/

从这个触发器代码看,结合对@@IDENTITY的介绍,看来某些情况下@@IDENTITY返回ID的还真可能牛头不对马嘴。

原创粉丝点击