数据库中已存在名为“IX_MY_INDEX_NAME”的对象

时间:2013-10-12 05:31:24

标签: sql sql-server sql-server-2012

每周一次(或左右),我在多线程应用程序中收到以下错误消息:

  

数据库中已有一个名为“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

是什么导致这种情况发生?上述陈述不是原子的吗?我错过了什么吗?

2 个答案:

答案 0 :(得分:7)

约束需要在数据库中唯一命名;在上面的示例中,如果两个线程几乎同时执行,则在创建第二个线程时,可能存在具有该约束的临时表。

要执行您想要执行的操作,请在创建表后创建UNIQUE索引;索引名称不必是唯一的。

答案 1 :(得分:1)

想到2个想法。 1)这取决于您如何生成约束名称:IX_MY_INDEX_NAME。该错误表明已经使用了名为index的索引(可能是另一个表)。 2)您提到它是一个多线程应用程序,是否有可能两个线程正在尝试执行相同的create语句。要对此进行排除,您可以将表创建更改为仅在不存在时创建。例如Oracle / Mysql - >如果不存在则创建表