sql-server - 如何创建唯一的用户 key

标签 sql-server database

场景:我有一个相当通用的表(数据),它有一个标识列。该表中的数据是分组的(比如说按城市)。

用户需要标识符才能在纸质表格等上打印。 用户只能访问他们的引用数据,因此如果他们为此目的使用身份列,他们将看到奇数(例如“纽约”用户可能会看到 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/

相关文章:

mysql - XML 导入到 WordPress 数据库

SQL 查询 - 从两个不同级别的层次结构中获取总和

c# - 一张表或多张表,数据只有一列发生变化

c# - 如何创建搜索框?

MySQL:缺少世界数据库特殊字符?

sql - 在 SQL Server 2008 中查找有错误的存储过程?

使用逗号分隔值的 SQL 查询

java - 使用 SQL Azure 关闭连接

mysql - SQL 数字格式

sql - 拉取数据而不改变引用表中的项目顺序