ident_current 显示错误的最后插入 id

Posted

技术标签:

【中文标题】ident_current 显示错误的最后插入 id【英文标题】:ident_current shows wrong last inserted id 【发布时间】:2013-11-02 06:00:01 【问题描述】:

我遇到了问题。我使用 SQL Server 2008 Express。

当新行插入到表中时,IDENT_CURRENT 函数返回正确的值(最后插入的行 ID)。但是当最后插入的行被删除(DELETE FROM REPORT WHERE ID='last_inserted_id')时,IDENT_CURRENT 函数返回被删除行的 id。它不更新。

我需要从表中返回最后一个 id。

SELECT IDENT_CURRENT('report')

【问题讨论】:

IDENT_CURRENT 工作得很好——你的期望是错误的。 SQL Server 中的标识值是从不“回收”的——一旦分发出去,它们就消失了,永远不会被重复使用。 谢谢。知道了。如何在任何会话和任何范围内获取最后一行 ID? 你需要这些信息做什么?标识是每个表 - 所以这样一个“全局”最高行 id 看起来真的不是很有用.... 感谢您的回复。我的意思是每桌。不是全球性的。如果最后一行被删除,身份将永远不会反转。但是当我从表中删除最后一行时,ident_current 会给我最后的身份。但我需要获取最后一行 ID。如示例:在具有 id`s 的表中分别获取树行:[1,'a'],[2,'b'],[3,'c']。如果你得到最后一行ID,那么它是3。现在,删除最后一行并获取最后一行ID,所以它是2。如何实现它?谢谢 SELECT MAX(Rowid) FROM dbo.YourTable ??? 【参考方案1】:

这按预期工作。该函数返回最后使用的标识值,即使它已被删除。以下是 Microsoft 文档的摘录:

IDENT_CURRENT 返回为任何会话和任何范围内的特定表生成的最后一个标识值。

【讨论】:

谢谢。那么如何获取最后一个当前id呢? 您可能想要使用 SCOPE_IDENTITY。这是 MS 文档的链接 technet.microsoft.com/en-us/library/ms175098.aspx 如果您尝试捕获被删除行的 id,您可能需要向表中添加触发器。 SCOPE_IDENTITY 返回为当前会话和当前范围内的任何表生成的最后一个标识值。需要在任何会话和任何范围内获取表的最后一行 id。前任。分别在 id`s 的表中获得树行:[1,'a'],[2,'b'],[3,'c']。如果你得到最后一行 id 那么它是 3。现在,删除最后一行并获取最后一行 id,所以它是 2。实际上很简单。如何实现?谢谢【参考方案2】:

身份总是会上升。如果您删除行,它不会下降。另外,它的值可以有“空白”。 阅读本文了解详情http://technet.microsoft.com/en-us/library/ms186775.aspx

【讨论】:

谢谢。那么如何在任何会话和范围中获取最后一行 ID?我给@Brian Shamblen 写了一个例子。前任。得到一个表中的树行,id 分别为:[1, 'a'],[2, 'b'],[3, 'c']。如果你得到最后一行ID,那么它是3。现在,删除最后一行并获取最后一行ID,所以它是2。如何实现它?谢谢 也许如果你描述你的问题的目的,它会更容易回答。 SELECT max(id) 返回当前的最后一行。 SELECT @@IDENTITY 返回上次插入操作期间生成的 id。而且我无法理解您试图获得的价值及其目的。【参考方案3】:

如果您想要在表格中找到的最大 ID,只需使用

SELECT MAX(ID) FROM table

【讨论】:

以上是关于ident_current 显示错误的最后插入 id的主要内容,如果未能解决你的问题,请参考以下文章

如何在sql中插入记录时返回id(id为自动增长)

使用 SCOPE_IDENTITY/IDENT_CURRENT 时出现“直接执行 SQL;没有游标”错误

如何得到SqlServer的自增ID

SQL Server事务回滚对自增键的影响

SQLServer数据库DBCC CHECKIDENT命令介绍

SQL Server 主表主键自增量,如何获取主键呢?