2

у меня есть 2 таблицы:сервера SQL: Уникальное ограничение создает уникальный ключ и уникальный индекс

attCatAppSet, attCatAppSet_translation

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

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 

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

enter image description here

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

GO 
sp_helpIndex attCatAppSet 
GO 
sp_helpIndex attCatAppSet_translation 

enter image description here

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

Сначала румянец, siteLanguage_id имеет ограничение внешнего ключа, в то время как setOrder этого не делает. –

+0

оба ограничения имеют по крайней мере столбец FK, но это не должно быть проблемой. – Luther

ответ

3

Ваше ограничение в таблице 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.

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

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

С точки зрения производительности УНИКАЛЬНЫЕ ограничения и уникальные индексы фактически одинаковы с оптимизатором запросов, и вы не увидите любых преимуществ производительности для использования одного и другого.

+1

Таким образом, «тот же» результат может быть достигнут с помощью: CREATE UNIQUE INDEX [UQ_category_id_setOrder] ON [dbo]. [AttCatAppSet] ( [category_id] , [setOrder] )? – Luther

+0

Да, см. Http://technet.microsoft.com/en-us/library/ms175132%28v=sql.105%29.aspx –

+2

@Luther, внешний ключ может быть связан с первичным ключом, уникальным ограничением или уникальный индекс. Любой из них, имеющих те же столбцы, что и внешний ключ, может использоваться, но у вас нет прямого контроля над тем, который используется, если у вас избыточные индексы. См. Http://www.dbdelta.com/secrets-of-foreign-key-index-binding/ –