插入自动递增ID问题请教。。

午夜恋曲 2016-06-27 02:55:01
INSERT INTO _Items (ItemID,。。。。。。。。。。。。。
update _Invent set ID=@@identity 。。。。。。。。。。。。。

第一个语句自动生成的递增变量是ID列。
第二个语句设置表_Invent列ID 的数值为第一个插入语句的自动生成的ID变量。

现在发现一个问题。当没有其他人物操作的时候 @@identity 确实是第一个语句生成的id。但是当其他人物同时操作的时候 @@identity 就不是刚才插入语句生成的ID了。

请教大家,我如何强制第二个语句中的 SET ID 中的ID 为第一个语句生成的递增ID?

数据库为MSSQL2008R2
...全文
185 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
misterliwei 2016-06-27
  • 打赏
  • 举报
回复
实在不行的话,用OUTPUT试试?

IF OBJECT_ID('_ITEMS') IS NOT NULL
DROP TABLE _ITEMS
GO
CREATE TABLE _ITEMS(ID INT IDENTITY, ITEMID INT)
GO
DECLARE @ID TABLE(ID INT)

INSERT INTO _ITEMS
OUTPUT INSERTED.ID INTO @ID
VALUES(1222)

SELECT ID FROM @ID 

misterliwei 2016-06-27
  • 打赏
  • 举报
回复
@@identity是当前会话的,是会话隔离的。难道是你的插入和玩家的插入是使用了同一个会话?
午夜恋曲 2016-06-27
  • 打赏
  • 举报
回复
引用 6 楼 misterliwei 的回复:
但是@@identity是当前会话的,其他人也是用同一个会话?
@@identity应该不是当前会话的。 _Items是一个游戏的物品表,当玩家在里面操作的时候不停插入数据。所以这个表的最后一个插入ID是不停变化的。 我用语句执行那两个语句时候,用@@identity命令得到的最后一个ID数值10次有8次是别的玩家操作时候得到的最后的插入ID, 如果游戏停掉, 玩家不再往里插入数据,那么我执行那两个语句得到的最后id就是我语句插入生成的最后id。 我希望得到的最后递增id,不是那个表里自动生成的最后的id,而是我这个插入语句插入时候生成的递增id。
中国风 2016-06-27
  • 打赏
  • 举报
回复
引用 4 楼 ndcc5 的回复:
[quote=引用 2 楼 roy_88 的回复:] 是不是有触发器,没触发器时你的应该是正确 有触发器时用 SELECT SCOPE_IDENTITY()
用SCOPE_IDENTITY() 也是有时候得到的是别人操作生成的递增ID最后的数值。[/quote] 你说这种情况不会出现 自己测 这是当前会话同一个作用域,不会受触发器影响
misterliwei 2016-06-27
  • 打赏
  • 举报
回复
但是@@identity是当前会话的,其他人也是用同一个会话?
卖水果的net 版主 2016-06-27
  • 打赏
  • 举报
回复
https://msdn.microsoft.com/zh-cn/library/ms175098.aspx IDENT_CURRENT 返回为某个会话和用域中的指定表生成的最新标识值。 @@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。 SCOPE_IDENTITY 返回为当前会话和当前作用域中的某个表生成的最新标识值。
午夜恋曲 2016-06-27
  • 打赏
  • 举报
回复
引用 2 楼 roy_88 的回复:
是不是有触发器,没触发器时你的应该是正确 有触发器时用 SELECT SCOPE_IDENTITY()
用SCOPE_IDENTITY() 也是有时候得到的是别人操作生成的递增ID最后的数值。
午夜恋曲 2016-06-27
  • 打赏
  • 举报
回复
引用 1 楼 misterliwei 的回复:
就是这么简单的两句:

INSERT INTO _Items (ItemID,。。。。。。。。。。。。。
update _Invent set ID=@@identity 。。。。。。。。。。。。
有触发器什么的吗?
没有,大体意思是这样,@@identity 命令是自动插入当前表_items自动生成的递增变量值。但是这个命令只适合没有其他人物进行数据处理的时候。比如我执行这个语句时候,别人同时执行了那个语句,我得到的@@identity就是那个人执行语句时候生成的@@identity了。。
中国风 2016-06-27
  • 打赏
  • 举报
回复
是不是有触发器,没触发器时你的应该是正确 有触发器时用 SELECT SCOPE_IDENTITY()
misterliwei 2016-06-27
  • 打赏
  • 举报
回复
就是这么简单的两句:

INSERT INTO _Items (ItemID,。。。。。。。。。。。。。
update _Invent set ID=@@identity 。。。。。。。。。。。。
有触发器什么的吗?

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧