场景:我有一个相当通用的表(数据),它有一个标识列。该表中的数据是分组的(比如说按城市)。
用户需要标识符才能在纸质表格等上打印。 用户只能访问他们的引用数据,因此如果他们为此目的使用身份列,他们将看到奇数(例如“纽约”用户可能会看到 1,37,2028... 作为列出的键。
理想情况下,他们会看到 1,2,3...(或类似的内容)
问题当然是并发性,这是一个 Web 应用程序,你不能只拥有以下内容: UserId = 从 City='New York' 的数据中选择 Count(*)+1
有没有人想出任何巧妙的方法来解决这个问题?
已更新 - 从下面的评论中我想我想要类似下面的 SP 的东西。不完全确定递归应如何在 CATCH block 中工作。
ALTER PROCEDURE [dbo].[DataContainer_Insert]
@SomeData varchar(max),
@DataContainerId int out
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN TRY
SELECT @UserId = MAX(UserId) From DataContainer
INSERT INTO DataContainer (UserId, SomeData)
VALUES (@UserId, SomeData)
SELECT @DataContainerId = scope_identity()
END TRY
BEGIN CATCH
--try again
exec DataContainer_Insert @DataContainerId, @SomeData
END CATCH
END
最佳答案
好吧,如果您在城市和 UserId 上添加跨越唯一性约束(以保证特定 ID 和城市只会有 1 个实例)。然后您只需要能够处理约束违规(通过重新提交)。
关于sql-server - 如何创建唯一的用户 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2822999/