2013-10-12 41 views
0

每週一次(或左右),我收到我的多線程應用程序中出現以下錯誤信息:已經有名爲「IX_MY_INDEX_NAME」的對象在數據庫中

已經有一個名爲「對象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 

是什麼原因導致這種情況發生?上述說法不是原子的嗎?我錯過了什麼嗎?

回答

6

約束條件需要在數據庫中唯一命名;在上面的例子中,如果兩個線程大致同時執行,那麼有可能存在一個具有該約束的臨時表,而第二個線程正在創建。

要做你想做的事情,創建表後創建一個UNIQUE索引;索引名稱不必是唯一的。

1

2想法浮現在腦海。 1)這取決於您如何生成約束名稱:IX_MY_INDEX_NAME。該錯誤指出已命名的索引已被使用(可能用於其他表)。 2)您提到它是一個多線程應用程序,是否有可能兩個線程試圖執行相同的創建語句。要排除這一點,您可以將表創建更改爲僅在不存在時創建。例如Oracle/Mysql - >創建表如果不存在

相關問題