【发布时间】:2018-02-22 08:38:02
【问题描述】:
我有一张如下表:
CREATE TABLE [Alg].[Sequence](
[Id] [int] IDENTITY(1,1) NOT NULL,
[SequenceId] [int] NOT NULL,
[CustomerId] [bigint] NOT NULL,
[Data] [text] NULL,
CONSTRAINT [PK_Sequence] PRIMARY KEY CLUSTERED
(
[SequenceId] ASC,
[CustomerId] ASC
)
这是另一个表的插入/更新触发器的块,我将数据插入到Sequence表:
--insert data into sequence table
SELECT @MaxSeqId = ISNULL(MAX(SequenceId),0)
FROM Alg.[Sequence] WITH (ROWLOCK)
WHERE CustomerId = @CustomerId
INSERT INTO Alg.[Sequence]
VALUES (
@MaxSeqId + 1
,@CustomerId
,@SendingData
,GETDATE()
)
所以每当高频插入过程(在有触发器的表上),就会发生违反重复键错误。我试过ROWLOCK,但没有用。我怎样才能防止这种情况发生?
更新
有人问我为什么不使用内置序列,我尝试过但找不到如何将序列与复合主键一起使用。我不希望 SequenceId 列是标识,实际上,我想保留 SequenceId 作为每个 CustomerId 的标识。您可以看到我的另一个 question 与此相关
【问题讨论】:
-
为什么要创建自己的序列表?推荐使用序列对象。在此处查找更多信息:docs.microsoft.com/en-us/sql/t-sql/statements/…
-
IDENTITY(1,1)不为你做增量,所以你不需要插入它?求朋友。 -
我已经更新了问题相关的序列对象。
-
您绝对可以而且应该在这里使用序列。我不假装知道您的目标是什么(我也不理解您的反对意见),但您实际上是在重新创建序列的损坏版本。如果您(几乎)可以使用您编写的代码来做到这一点,那么您可以使用序列正确地做到这一点。序列只是获得唯一整数的另一种方式。就这些。您仍然会为每个客户获得一个可用的序列号,只是碰巧它也是唯一的。
标签: sql sql-server sql-server-2014