Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Временные таблицы и уникальность имени индекса - проблема! (SQL Server 2008)  [new]
griniland
Member

Откуда: Msk
Сообщений: 28
Открываем сессию номер раз:

create table #tab (col int, constraint pk_table primary key (col));

Параллельно открываем сессию номер два:

create table #tab (col int, constraint pk_table primary key (col));


получаем совершенно дикую ошибку:
Msg 2714, Level 16, State 4, Line 2
There is already an object named 'pk_table' in the database.
Msg 1750, Level 16, State 0, Line 2

Типа, уже есть такой индекс (или constraint) pk_table !
Что за ерунда ? Ну ладно, я могу смириться с тем, что для постоянных таблиц имена индексов-констрейнов в пределах одной базы должны быть уникальными.
Но для временных - это просто бред, на мой взгляд.

Вопрос - кто как обходит этот момент ?
20 июл 11, 10:11    [10998393]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы и уникальность имени индекса - проблема! (SQL Server 2008)  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
griniland,
создаю не констрейны, а индексы
20 июл 11, 10:17    [10998433]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы и уникальность имени индекса - проблема! (SQL Server 2008)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
create table #tab (col int NOT NULL primary key); 


Сообщение было отредактировано: 20 июл 11, 10:20
20 июл 11, 10:19    [10998444]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы и уникальность имени индекса - проблема! (SQL Server 2008)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а не надо именовать констрейнты для времянок. синтаксис вполне допускает это делать. просто unique( f1, f2 )
20 июл 11, 10:19    [10998445]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы и уникальность имени индекса - проблема! (SQL Server 2008)  [new]
griniland
Member

Откуда: Msk
Сообщений: 28
Всем спасибо, кажется, разобрался.
Но все равно - бред какой-то, на мой взгляд ))
Не вижу смысла в уникальности имени констрейнта даже для постоянной таблицы, не говоря уже о времянках.
20 июл 11, 10:31    [10998518]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы и уникальность имени индекса - проблема! (SQL Server 2008)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
griniland
Всем спасибо, кажется, разобрался.
Но все равно - бред какой-то, на мой взгляд ))
Не вижу смысла в уникальности имени констрейнта даже для постоянной таблицы, не говоря уже о времянках.
Это объекты (см. sys.objects). Почему же это они не должны иметь уникальное имя?
А вот индексы - не объекты. Их можно создавать во временных таблицах с нормальными именами в любом количестве.
20 июл 11, 10:43    [10998595]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы и уникальность имени индекса - проблема! (SQL Server 2008)  [new]
Glory
Member

Откуда:
Сообщений: 104751
griniland
Не вижу смысла в уникальности имени констрейнта даже для постоянной таблицы, не говоря уже о времянках.

Есть уникальность на имя объекта в таблице sysobjects. А констрейнт - это именно объект. Как таблица, представление и тп
20 июл 11, 10:45    [10998604]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы и уникальность имени индекса - проблема! (SQL Server 2008)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31956
griniland
Но все равно - бред какой-то, на мой взгляд ))
Не вижу смысла в уникальности имени констрейнта даже для постоянной таблицы, не говоря уже о времянках.
Так уж стандарт сложился, давно уже.

В принципе констрейны, как и индексы, принадлежат одной и только одной таблице. Соответственно можно было бы, как и для индексов, использовать всегда составное поле с именем таблицы и не требовать уникальности имени констрейна.

Но вот так вот принято уже много десятков лет, в SQL Server-е всего лишь сделано как у всех.
20 июл 11, 10:53    [10998666]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы и уникальность имени индекса - проблема! (SQL Server 2008)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31956
alexeyvg
Так уж стандарт сложился, давно уже.
Соответственно, решение - не именовать констрейны, а если констрейн нужно создать позже создания таблицы, то уникальный констрейн можно заменить уникальным индексом
20 июл 11, 10:55    [10998681]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы и уникальность имени индекса - проблема! (SQL Server 2008)  [new]
griniland
Member

Откуда: Msk
Сообщений: 28
[quot alexeyvg]
griniland
Но все равно - бред какой-то, на мой взгляд ))

Но вот так вот принято уже много десятков лет, в SQL Server-е всего лишь сделано как у всех.


Позвольте не согласиться - родственник Sybase допускает одинаковое имя primary key для временных таблиц (да и для постоянных, вероятно, тоже).
Тот же sysobjects.

И даже ораклоподобный Postgres не видит в этом криминала (хотя не позволяет создавать индексы с одинаковым именем на разные постоянные таблицы).

Собственно, ошибка и выплыла при тестировании в другой среде (изначально пишем под Postgres).

В любом случае, спасибо всем откликнувшимся - будем писать по-новому, с учетом прибабахов этого диалекта T-SQL
20 июл 11, 12:27    [10999376]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить