1

我有一个带有INT主键列的表。我不想使用GUIDorIDENTITY作为主键。

IDENTITY我想知道在不使用orGUID作为表中的主键列的情况下获取下一个 ID 的最佳方法是什么。我不介意在表中使用GUIDor IDENTITY,除非它是主键列。

我必须找到下一个可用的ID(即获取 MAX ID 并将其增加 1),并使用它:

SELECT @id=ISNULL(max(AlbumId)+1,1) FROM Albums

但是,当我这样做时,我想防止其他应用程序插入表中,这样我们就不会遇到任何问题。

注意:请不要将此问题标记为DUPLICATE。我已经完成了这个答案,但无法正确理解。有人愿意向我解释他们在做什么吗?我可以使用相同的技术吗?

4

1 回答 1

6

对于 SQL Server 2000 - 2008 R2,使用INT IDENTITY迄今为止简单、最可靠的方法。

尝试自己做这件事就像重新发明轮子一样,并且有很多可能出错的方式 - 那为什么还要麻烦呢?您需要 (a) 确保该机制是并发安全的(并且只是做SELECT MAX(ID) + 1是不安全的!),并且您 (b) 需要确保您的机制不会成为系统性能的主要瓶颈或者......

INT IDENTITY作主键有什么问题?好像不太理性。。。

对于 SQL Server 2012及更高版本,您还可以考虑使用 a SEQUENCE(基本上是一个IDENTITY没有专门耦合到单个表的)

更新:您在帖子中提到的 其他 SO 问题基本上是对 a 进行“自己动手”模拟SEQUENCE

  • 一个表包含对 ( sequencename, currentvalue)
  • 当您要求给定序列的新值时,新值仅通过使用子句UPDATE相结合的语句来确定OUTPUT

为什么这么复杂?IDENTITY这是安全处理并发请求的最简单和最有效的方法(除了使用)。该UPDATE语句将始终为您要从中获取新的序列专门锁定“序列表”中的那一行ID- 从而防止任何其他事务获取相同的ID值并获取重复的值 - 并ID使用该OUTPUT子句将新的返回到呼叫者,召集者。

于 2012-12-05T15:32:26.043 回答