Когда я хочу, чтобы столбец имеет разные значения, я могу либо использовать ограничение
create table t1(
id int primary key,
code varchar(10) unique NULL
);
go
или я могу использовать уникальный индекс
create table t2(
id int primary key,
code varchar(10) NULL
);
go
create unique index I_t2 on t2(code);
Столбцы с уникальными ограничениями кажутся хорошими кандидатами для уникальных индексов.
Известны ли какие-либо причины использовать уникальные ограничения и не использовать уникальные индексы?
Под капотом уникального ограничения осуществляется таким же образом, как уникальный индекс - индекс, необходимой для эффективного выполнения требований ограничение. Даже если индекс будет создан в результате уникального ограничения, планировщик запросов может использовать его как и любой другой индекс, если он воспринимает это как лучший способ подойти к данному запросу.
Так для базы данных, которая поддерживает функции выбор часто сведется к предпочитаемый стиль и консистенцию.
Если вы планируете использовать индекс в качестве индекса (т. е. ваш код может полагаться на поиск/сортировка/фильтрация на поле, чтобы быть быстрым) я бы явно использовать уникальный индекс (и комментарий источника), а не ограничение понятно - таким образом, если уникальность требование изменилось в более поздней версии приложения вы (или другой программист) будут знать, чтобы убедиться, что неуникальный индекс ставится на место уникальным (просто сняв ограничения уникальности будет полностью удалить индекс). Также конкретный показатель может быть назван в Указание индекса (т. е. с(индекс(ix_index_name)), что я Дон'т думаю, что и в случае индекса, созданного закулисой для управления уникальности, так как вы вряд ли знаете его имя.
Аналогичным образом, если вы не только для обеспечения уникальности как бизнес-скорее правило, чем поле нужно искать или использовать для сортировки, тогда я'd с помощью ограничений, опять же, чтобы сделать назначение более очевидным, когда кто-то смотрит на ваш стол определению.
Обратите внимание, что если вы используете оба ограничения Unique и уникальный индекс по одному полю базы данных не будет достаточно ярким, чтобы увидеть дублирования, так что вы будете в конечном итоге с двумя индексами, которые занимают дополнительное пространство и замедляют операции вставки/обновления.
В дополнение к очков в другие ответы, вот некоторые ключевые различия между двумя.
Примечание: сообщения об ошибках с SQL сервер 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.
Но уникальный индекс за ограничение первичного ключа или ограничение уникальности может быть отключен, как и любой уникальный индекс. Шляпа-совет Brain2000.
ALTER INDEX P1_u ON dbo.P1 DISABLE ;
Обратите внимание на обычное предупреждение о том, что при отключении кластеризованного индекса делает данные недоступными.
Ограничения уникальности поддерживать параметры индексирования как заполнения
и ignore_dup_key в
, Хотя это еще'т на всех версиях SQL сервера.
Некластеризованные индексы могут включать неиндексированных столбцов (называемых покрывающий индекс, это существенное повышение производительности). Индексы за первичного ключа и ограничения уникальности не может содержать столбцы. Шляпа-совет @ypercube.
Ограничение уникальности не могут быть отфильтрованы.
Уникальный индекс может быть отфильтрован.
CREATE UNIQUE NONCLUSTERED INDEX Students6_DrivesLicence_u
ON dbo.Students6( DriversLicenceNo ) WHERE DriversLicenceNo is not null ;
Ограничение внешнего ключа может ссылаться фильтрованный уникальный индекс, хотя он может ссылаться не фильтрованный уникальный индекс (Я думаю, что это был добавлен в SQL Server 2005 с).
При создании ограничения, указав имя ограничения является обязательным (для всех пяти типов ограничений). Если вы Don'т указать имя, то в 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
) ;
При создании индексов, необходимо указать имя.
Шляпа-совет @я-одна.
http://technet.microsoft.com/en-us/library/aa224827(в=в SQL.80).аспн
Цитировать MSDN в качестве авторитетного источника:
нет существенных различий между созданием уникального ограничения и создать уникальный индекс, который не зависит от ограничений. Проверка данных происходит в том же порядке, и оптимизатор запросов не может отличить уникальный индекс создается ограничение или созданные вручную. Однако, создавая ограничение Unique для столбца назначение индекса ясно... подробнее здесь
И...
ядро СУБД автоматически создает уникальный индекс, чтобы обеспечить требование уникальности уникальности. Поэтому, если попытка вставить дубликат строки, база данных возвращает двигателя сообщение об ошибке, указывающее на ограничение уникальности было нарушено > и не добавить строку в таблицу. Если кластеризованный индекс явно указано, уникальный, некластеризованный индекс создается По умолчанию для обеспечения уникальности... подробнее здесь
Другие в: https://technet.microsoft.com/en-us/library/aa224827%28v=sql.80%29.aspx
Одним из основных различий между Unique и уникальный индекс, что ограничения внешнего ключа в другой таблице может ссылаться на столбцы, которые составляют уникальное ограничение. Это не относится к уникальным индексам. Кроме того, уникальные ограничения определяются как часть стандарта ANSI, в то время как индексы не. Наконец, ограничение на уникальность данных в рассматриваемой жить в области логического проектирования базы данных (который может быть реализован по-разному различными двигателями DB), а индекс физического аспекта. Таким образом, уникальное ограничение носит скорее декларативный характер. Я'д предпочитают уникального ограничения почти во всех случаях.
В Oracle основным отличием является вы можете создать функцию-уникальный индекс, который не выполнимо с уникальными ограничениями:
Например
create unique index ux_test on my_table (case when amount != 0 then fk_xyz end);
Так fk_xyz только уникальные записи, которые имеют сумму != 0`.
Ограничение уникальности предпочтительнее, чем уникальный индекс. Если ограничение не является уникальным, вы должны использовать обычный или уникальный индекс. Сдерживающим фактором является также другой тип индекса. Индекс используется для быстрого доступа.
Уникальные индексы могут иметь предложения where. Например, вы можете создать индексы для каждого года в зависимости от даты столбца
WHERE Sale_Date BETWEEN '2012-01-01' AND '2012-12-31'