如何在不在sql server中插入记录的情况下知道表的下一个主键值?

ami*_*tel 5 sql sql-server sql-server-2005 sql-server-2008 c#-4.0

我的项目中有一些东西,我需要在字段中显示下一个主键而不在物理上插入记录?

如何在不插入记录的情况下知道主键的下一个值?

即,Lets有10条记录,ID列为主键.现在我删除了第10条记录,所以下一个值将是11.

我想知道下一个主键的值(在我的情况下为11),而不是在表中物理地插入记录.

简而言之,未来下一个主键的价值.

我该怎么办?

请提供解决方案.

Adr*_*der 8

编辑(非常重要)

应该注意的是,此方法可用于预测下一个id,但不会保证此值.这样做的原因是注释中提到的@marc_s,在您请求值的时间和使用它的时间之间,另一个事务可能已插入此表,使得检索的值的假设为null和void.

如上所述,如果您的实现基于这样的假设,那么您已经犯了一些设计错误,并且应该将此解决方案重新作为第一优先级.

来自IDENT_CURRENT(Transact-SQL)

返回为指定表或视图生成的最后一个标识值.生成的最后一个标识值可以用于任何会话和任何范围.

看看下面的例子

CREATE TABLE #Table (
        ID INT IDENTITY(1,1),
        Val INT
)

INSERT INTO #Table SELECT 1
INSERT INTO #Table SELECT 2
INSERT INTO #Table SELECT 3

SELECT * FROM #Table

DELETE FROM #Table WHERE ID >= 2

SELECT * FROM #Table

SELECT IDENT_CURRENT('#Table')

DROP TABLE #Table
Run Code Online (Sandbox Code Playgroud)

  • 确切地说 - 你可以猜测**下一个值 - 但不能可靠地预测它.这是我的观点.但我同意:为什么你甚至需要提前知道**,在插入之前?如果你需要它,你的设计开始时很可疑.... (3认同)
  • 在可靠性方面达成共识.我永远不会用它来"预测"下一个值,以便在关系实例中使用它,这将是完全愚蠢的.为什么要预测分配给子/多关系的值.这就是数据库的用途,不要试图在代码中保持这样的东西,你将会有很多痛苦的事情在路上 (2认同)
  • @marc_s我认为必须插入答案中的BOLD注释,以便通知其他OP这个X-) (2认同)

Spe*_*ort 5

你问的其实没有意义。数据库设计为支持多重访问,因此即使有一种方法可以在不插入记录的情况下确定下一个主键身份,也不能保证另一个连接不会写入该表并在下一个事务完成之前声明该身份。如果您在想“好吧,我可以锁定它”,那么您基本上已经排除了任何可能的情况,在这种情况下,了解未来的身份密钥可能会对您有所帮助。

那么您想要未来身份密钥的理由是什么?