为一组行生成唯一ID的最佳方法?

时间:2019-03-22 19:41:08

标签: sql sql-server

这非常简化,但是我有一个Web服务数组,看起来像这样:

[12345, 34131, 13431]

,我将遍历数组并将它们一个一个地插入数据库,我希望该表看起来像这样。这些值将与一个唯一的标识符绑定,表明它们是

1 12345
1 34131
1 13431

然后,如果出现另一个数组,它将插入其所有具有唯一ID 2的数字。基本上,这是为了跟踪组。

可能有多个进程同时执行此操作,那么生成唯一标识符并确保2个进程不能使用同一进程的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

您应该修复数据模型。它缺少一个实体,例如batches

create table batches (
    batch_id int identity(1, 1) primary key,
    created_at datetime default getdate()
);

您可能还有其他信息。

您的表应具有外键引用,batch_idbatches

然后您的代码应执行以下操作:

  • 将新行插入batches中。新一批开始了。
  • 获取刚刚创建的ID。
  • 将此ID用于您要插入的行。

尽管您可以按顺序执行此操作,但对我来说,单独的表更有意义。您正在将一堆行捆绑到某物中。 某物应该在数据模型中表示。

答案 1 :(得分:1)

您可以声明以下内容: 宣告@UniqueID UNIQUEIDENTIFIER = NEWID();

并在插入批次时将其用作唯一标识符

答案 2 :(得分:0)

由于它不是主键,所以标识列不可用。老实说,我可能只是使用一个单独的ID序列表来对其进行跟踪。创建一个可获取下一个可用ID的proc,然后对其进行递增。如果您在proc的开头打开了一个事务,它应该防止第二个线程获取到该线程的更新,直到第一个线程完成更新为止。

类似的东西:

CREATE PROCEDURE getNextID
     @NextNumber INT          OUTPUT
    ,@id_type    VARCHAR(20)
AS
BEGIN
  SET NOCOUNT ON;

    DECLARE @NextValue TABLE (NextNumber int);

BEGIN TRANSACTION;

    UPDATE id_sequence
      SET last_used_number = ISNULL(@NextNumber, 0) + 1
     OUTPUT inserted.last_used_number INTO @NextValue(NextNumber)
    WHERE id_type = @id_type

    SELECT @NextNumber = NextNumber FROM @NextValue

COMMIT TRANSACTION;

END