给定位置的全局唯一整数ID(顺序)

时间:2008-09-30 23:16:01

标签: sql-server

我需要为给定位置创建唯一ID,并且位置ID必须是顺序的。所以它基本上就像一个主键,除了它还绑定到locationID。所以3个不同的位置都有ID,如1,2,3,4,5,...,n

最好的方法是什么? 我还需要一种安全的方法来获取给定位置的nextID,我猜我可以将一个事务放在获取下一个ID的存储过程上吗?

3 个答案:

答案 0 :(得分:2)

我看到这样做的一种方法是创建一个将位置映射到下一个ID的表。

CREATE TABLE LocationID {
    Location varchar(32) PRIMARY KEY,
    NextID int DEFAULT(1)
}

在存储过程中,您可以执行更新并获取当前值,同时增加值:

...
UPDATE LocationID SET @nextID = NextID, NextID = NextID + 1 WHERE Location = @Location
...

以上可能不是非常便携,您最终可能会获得增量值而不是当前值。您可以根据需要调整列的默认值。

另一件需要注意的事情是,如果你打算从另一个存储过程或应用程序代码中获取它,你会经常遇到这种情况。如果它来自另一个存储过程,那么一次一个可能没问题。如果你打算从应用程序代码中点击它,你可能最好抓住一系列值,然后将它们逐个发送到你的应用程序然后再抓住另一个范围。如果应用程序发生故障,它可能会在序列中留下空白,同时仍然有一半分配的块。

答案 1 :(得分:1)

您需要包装代码以查找下一个ID以及在同一事务中保存行的代码。你不想要(伪代码):

transaction {
   id = getId
}

... other processing

transaction {
   createRowWithNewId
}

因为在“......其他处理”

期间可以保存具有该id的另一个对象

答案 2 :(得分:0)

如果不需要保留,则可以在查询中始终执行此操作,而不是将其存储在表本身中。

select
  locationID
  ,row_number() over (partition by locationID order by (select null)) as LocationPK
From
  YourTable