В дополнение к пунктам в других ответах, вот некоторые ключевые различия между ними.
Примечание. Сообщения об ошибках взяты из SQL Server 2012.
ошибки
Нарушение уникального ограничения возвращает ошибку 2627.
Msg 2627, Level 14, State 1, Line 1
Violation of UNIQUE KEY constraint 'P1U_pk'. Cannot insert duplicate key in object 'dbo.P1U'. The duplicate key value is (1).
The statement has been terminated.
Нарушение уникального индекса возвращает ошибку 2601.
Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.P1' with unique index 'P1_u'. The duplicate key value is (1).
The statement has been terminated.
Отключение
Уникальное ограничение не может быть отключено.
Msg 11415, Level 16, State 1, Line 1
Object 'P1U_pk' cannot be disabled or enabled. This action applies only to foreign key and check constraints.
Msg 4916, Level 16, State 0, Line 1
Could not enable or disable the constraint. See previous errors.
Но уникальный индекс, лежащий в основе ограничения первичного ключа или уникального ограничения, может быть отключен, как и любой уникальный индекс. Hat-tip Brain2000.
ALTER INDEX P1_u ON dbo.P1 DISABLE ;
Обратите внимание на обычное предупреждение о том, что отключение кластеризованного индекса делает данные недоступными.
Параметры
Уникальные ограничения поддерживают такие параметры индексирования, как FILLFACTOR
и IGNORE_DUP_KEY
, хотя это было не так для всех версий SQL Server.
Включенные столбцы
Некластеризованные индексы могут включать в себя неиндексированные столбцы (называемые индексом покрытия, это значительное повышение производительности). Индексы за ограничениями PRIMARY KEY и UNIQUE не могут включать столбцы. Hat-tip @ypercube.
фильтрация
Уникальное ограничение не может быть отфильтровано.
Уникальный индекс может быть отфильтрован.
CREATE UNIQUE NONCLUSTERED INDEX Students6_DrivesLicence_u
ON dbo.Students6( DriversLicenceNo ) WHERE DriversLicenceNo is not null ;
Ограничения внешнего ключа
Ограничение внешнего ключа не может ссылаться на отфильтрованный уникальный индекс, хотя оно может ссылаться на не отфильтрованный уникальный индекс (я думаю, что это было добавлено в SQL Server 2005).
Именование
При создании ограничения указывать имя ограничения необязательно (для всех пяти типов ограничений). Если вы не укажете имя, MSSQL сгенерирует его для вас.
CREATE TABLE dbo.T1 (
TID int not null PRIMARY KEY
) ;
GO
CREATE TABLE dbo.T2 (
TID int not null CONSTRAINT T2_pk PRIMARY KEY
) ;
При создании индексов необходимо указать имя.
Hat-tip @ i-one.
связи
http://technet.microsoft.com/en-us/library/aa224827(v=SQL.80).aspx
http://technet.microsoft.com/en-us/library/ms177456.aspx