2013-10-12 4 views
0

Раз в неделю (или около того), я получаю следующее сообщение об ошибке в пределах моей многопоточных приложений:Существует уже объект с именем «IX_MY_INDEX_NAME» в базе данных

Существует уже объект с именем «IX_MY_INDEX_NAME 'в базе данных. Не удалось создать ограничение.

СП в вопросе создает временную таблицу следующим образом:

--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) Вы упомянули, что это многопоточное приложение, возможно ли, что два потока пытаются выполнить один и тот же оператор create. Чтобы исключить это, вы можете изменить создание таблицы, чтобы создать ее только в том случае, если она не существует. например Oracle/Mysql -> CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ

Смежные вопросы