sql-сервер: уникальное ограничение создает уникальный ключ и уникальный индекс

У меня есть 2 таблицы:

attCatAppSet, attCatAppSet_translation

В обеих таблицах я применил уникальное ограничение для двух столбцов (которые не являются первичными ключами), чтобы значения пары столбцов не могли дублироваться.

GO
ALTER TABLE attCatAppSet
ADD CONSTRAINT UQ_category_id_setOrder 
UNIQUE(category_id, setOrder)
GO


GO
ALTER TABLE attCatAppSet_translation
ADD CONSTRAINT UQ_siteLanguage_id_attCatAppSet_id 
UNIQUE(siteLanguage_id, attCatAppSet_id)
GO

Результат: глядя в проводник объектов получаю 2 разные реализации своих команд. В таблице attCatAppSet существует ограничение уникального индекса. В таблице attCatAppSet_translation есть уникальный индекс и ограничение уникального ключа.

введите здесь описание изображения

То же самое показывает, если я позвоню:

GO
sp_helpIndex attCatAppSet
GO
sp_helpIndex attCatAppSet_translation

введите здесь описание изображения

  • Почему у меня есть две разные реализации запроса?
  • В чем разница между двумя результатами?

person Luther    schedule 03.10.2014    source источник
comment
На первый взгляд, siteLanguage_id имеет ограничение внешнего ключа, а setOrder — нет.   -  person Rahul Vijay Dawda    schedule 03.10.2014
comment
оба ограничения имеют по крайней мере столбец FK, но это не должно быть проблемой.   -  person Luther    schedule 03.10.2014


Ответы (1)


Ваше ограничение в таблице attCatAppSet содержит поле setOrder, которое не является внешним ключом. Таким образом, ваш внешний ключ в attCatAppSet — это просто category_id, и он также отображается как внешний ключ. Но ваше ограничение UNIQUE(category_id, setOrder) требует комбинированного уникального индекса category_id и setOrder, поэтому этот индекс был создан и отображается как обычный индекс (а не как внешний ключ).

Внешние ключи используются для определения отношений между таблицами. Кажется, что вы уже создали отношения до создания этих ограничений. (например, вы уже определили связь между таблицами attCatAppSet_translation и siteLanguage и т. д.)

Ограничение attCatAppSet_translation содержит два внешних ключа, поэтому оно отображается как ключ, который имеет следующее значение: attCatAppSet_translation таблица содержит только уникальные комбинации siteLanguage и attCatAppSet.

Было создано только два комбинированных уникальных индекса. Оба индекса, созданные SQL Server, функционально эквивалентны, только они отображаются с разными значками. Речь идет только о том, как документирована модель базы данных в SQL Server Management Studio.

Дополнительная информация здесь и здесь .

Ограничения UNIQUE являются частью определения ANSI SQL, а определение ограничений UNIQUE является частью определения логического дизайна базы данных.

С точки зрения производительности ограничения UNIQUE и уникальные индексы практически одинаковы для оптимизатора запросов, и вы не увидите никакого преимущества в производительности при использовании одного по сравнению с другим.

person Vojtěch Dohnal    schedule 03.10.2014