每周一次(或左右),我在多线程应用程序中收到以下错误消息:
数据库中已有一个名为“IX_MY_INDEX_NAME”的对象。 无法创建约束。
有问题的SP会创建一个临时表,如下所示:
--removed for brevity
CREATE TABLE #MyTable
(
[IndexId] INT UNIQUE IDENTITY (1, 1) NOT NULL,
[WhateverId] INT NOT NULL,
[CustomerId] INT NULL,
[VendorId] INT NULL,
CONSTRAINT IX_MY_INDEX_NAME UNIQUE (
WhateverId,
CustomerId,
VendorId
)
)
--removed for brevity
是什么导致这种情况发生?上述陈述不是原子的吗?我错过了什么吗?
答案 0 :(得分:7)
约束需要在数据库中唯一命名;在上面的示例中,如果两个线程几乎同时执行,则在创建第二个线程时,可能存在具有该约束的临时表。
要执行您想要执行的操作,请在创建表后创建UNIQUE索引;索引名称不必是唯一的。
答案 1 :(得分:1)