我需要为给定位置创建唯一ID,并且位置ID必须是顺序的。所以它基本上就像一个主键,除了它还绑定到locationID。所以3个不同的位置都有ID,如1,2,3,4,5,...,n
最好的方法是什么? 我还需要一种安全的方法来获取给定位置的nextID,我猜我可以将一个事务放在获取下一个ID的存储过程上吗?
答案 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