【问题标题】:How to increment the Identity column如何增加标识列
【发布时间】:2011-11-26 13:26:43
【问题描述】:

我在表中使用标识列作为主键。

在某些情况下,我需要在插入新行之前使用主键。

例如,在 Oracle 中我使用:select <sequence_name>.nextval into <variable> from dual 而且我确信在我的 sp 执行时没有人会插入任何具有相同 ID 的行。

对于 SQL Server,我可以读取当前的标识值并且它是递增的,但是如果不插入一行就无法递增它。

更新:问题是 - 在插入一行之前,我如何才能完成在 SQL Server 中使用 ID(作为标识列)的任务,并确保它在我的存储过程结束时是唯一的。

更新:我有一个带有 HierarchyId 列的表。在我的例子中,形成第一级层次结构的方法是根据 indentity 列插入 hierarchyId 列。我现在就是这样做的:

begin transaction

insert into [dbo].[Group](GroupTypeId,CompanyOwnerId,GroupHierarchyId)
     values(@GroupTypeId,@HeaderCompanyId,null)

     update [dbo].[Group] 
      set GroupHierarcyId=hierarchyid::GetRoot().GetDescendant(cast ('/'+cast(@NewGroupId as varchar)+'/' as hierarchyid),null) 
     where GroupId=scope_identity()

    commit

【问题讨论】:

  • 那么,您想首先插入主键列,然后将所有剩余列值设置为“Null”,对吗?
  • SQL Server 的下一个版本将引入sequence,我想这符合您的要求。这是 Aaron Bertrand 的一篇博客文章,介绍了该技术以及今天可以使用的其他技术。 sqlblog.com/blogs/aaron_bertrand/archive/2010/11/11/…
  • 简而言之:你不能 - 句号。 IDENTITY 列值仅在插入行后建立 - 这就是它的工作方式,也是你应该使用它的方式。有关 SQL Server“Denali”将带来的新功能(即 SEQUENCE 作为成熟的 DB 对象),请参阅上面的评论

标签: sql-server-2008 identity-column


【解决方案1】:

你可以在表上加一个排他锁,得到最大ID,加1。那将是你的下一个身份证。插入数据,解锁表格。

然而,

我无法理解为什么要在创建值之前使用它。你能发布更多关于这方面的信息吗?

【讨论】:

  • +1 也:IDENTITY 列没有一直递增 1....这是默认值,但可能会有所不同....
【解决方案2】:

如果您需要一个跨数据库和数据库服务器唯一的密钥,那么 GUID(全局唯一标识符)肯定可以满足这一需求。 如果你想生成一个新的 GUID 服务器,你可以简单地使用NEWID() 函数

SELECT NEWID()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多