Когда я хочу, чтобы столбец имел разные значения, я могу использовать ограничение
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);
Столбцы с уникальными ограничениями кажутся хорошими кандидатами на уникальные индексы.
Есть ли известные причины использовать уникальные ограничения и не использовать уникальные индексы?
Ответы:
Под капотом уникальное ограничение реализуется так же, как и уникальный индекс - индекс необходим для эффективного выполнения требования по применению ограничения. Даже если индекс создается в результате ограничения UNIQUE, планировщик запросов может использовать его, как и любой другой индекс, если он видит его как лучший способ приблизиться к данному запросу.
Таким образом, для базы данных, которая поддерживает обе функции, выбор, который следует использовать, часто сводится к предпочтительному стилю и согласованности.
Если вы планируете использовать индекс в качестве индекса (т.е. ваш код может полагаться на быстрый поиск / сортировку / фильтрацию в этом поле), я бы явно использовал уникальный индекс (и комментировал источник), а не ограничение, чтобы сделать это clear - таким образом, если требование уникальности будет изменено в более поздней редакции приложения, которое вы (или какой-либо другой кодировщик) узнаете, чтобы убедиться, что вместо уникального индекса ставится неуникальный индекс (просто удаление уникального ограничения приведет к удалению индекс полностью). Также конкретный индекс может быть назван в подсказке индекса (т. Е. WITH (INDEX (ix_index_name)), что, я думаю, не относится к индексу, созданному за кулисами для управления уникальностью, поскольку вы вряд ли узнаете его имя.
Точно так же, если вам нужно только обеспечить уникальность как бизнес-правило, а не поле, которое нужно искать или использовать для сортировки, тогда я бы использовал ограничение, чтобы снова сделать предполагаемое использование более очевидным, когда кто-то еще смотрит на определение вашей таблицы.
Обратите внимание, что если вы используете как уникальное ограничение, так и уникальный индекс в одном и том же поле, база данных будет недостаточно яркой, чтобы увидеть дублирование, поэтому вы получите два индекса, которые будут занимать дополнительное пространство и замедлять вставку / обновление строк.
источник
CREATE TABLE #T(X INT CONSTRAINT PK PRIMARY KEY NONCLUSTERED);SELECT * FROM #T WITH(INDEX(PK)) WHERE X = 1
, Индексы могут быть более гибкими, хотя в этом случае ограничения не поддерживают все параметры индекса, такие какINCLUDE
столбцы d или отфильтрованные индексы.В дополнение к пунктам в других ответах, вот некоторые ключевые различия между ними.
Примечание. Сообщения об ошибках взяты из SQL Server 2012.
ошибки
Нарушение уникального ограничения возвращает ошибку 2627.
Нарушение уникального индекса возвращает ошибку 2601.
Отключение
Уникальное ограничение не может быть отключено.
Но уникальный индекс, лежащий в основе ограничения первичного ключа или уникального ограничения, может быть отключен, как и любой уникальный индекс. Hat-tip Brain2000.
Обратите внимание на обычное предупреждение о том, что отключение кластеризованного индекса делает данные недоступными.
Параметры
Уникальные ограничения поддерживают такие параметры индексирования, как
FILLFACTOR
иIGNORE_DUP_KEY
, хотя это было не так для всех версий SQL Server.Включенные столбцы
Некластеризованные индексы могут включать в себя неиндексированные столбцы (называемые индексом покрытия, это значительное повышение производительности). Индексы за ограничениями PRIMARY KEY и UNIQUE не могут включать столбцы. Hat-tip @ypercube.
фильтрация
Уникальное ограничение не может быть отфильтровано.
Уникальный индекс может быть отфильтрован.
Ограничения внешнего ключа
Ограничение внешнего ключа не может ссылаться на отфильтрованный уникальный индекс, хотя оно может ссылаться на не отфильтрованный уникальный индекс (я думаю, что это было добавлено в SQL Server 2005).
Именование
При создании ограничения указывать имя ограничения необязательно (для всех пяти типов ограничений). Если вы не укажете имя, MSSQL сгенерирует его для вас.
При создании индексов необходимо указать имя.
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
источник
Чтобы процитировать MSDN как авторитетный источник:
А также...
Другое в: https://technet.microsoft.com/en-us/library/aa224827%28v=sql.80%29.aspx
источник
Одно из основных различий между уникальным ограничением и уникальным индексом заключается в том, что ограничение внешнего ключа в другой таблице может ссылаться на столбцы, которые составляют уникальное ограничение. Это не относится к уникальным индексам. Кроме того, уникальные ограничения определены как часть стандарта ANSI, а индексы - нет. Наконец, считается, что уникальное ограничение находится в области логического проектирования баз данных (которое может быть реализовано по-разному различными механизмами БД), в то время как индекс является физическим аспектом. Поэтому уникальное ограничение является более декларативным. Я бы предпочел уникальное ограничение почти во всех случаях.
источник
В Oracle основным отличием является то, что вы можете создать уникальный для функции индекс, который невозможно выполнить с уникальными ограничениями:
Например
Так
fk_xyz
что единственно для записи, которые естьamount != 0
.источник
WHERE
предложения.CREATE UNIQUE NONCLUSTERED INDEX P4_U ON DBO.P4 ( PID ) WHERE TXT = 'qwert' ;
УНИКАЛЬНОЕ Ограничение предпочтительнее УНИКАЛЬНОГО Индекса. Когда ограничение не уникально, вам нужно использовать обычный или неуникальный индекс. Ограничение также является другим типом индекса. Индекс используется для более быстрого доступа.
Уникальные индексы могут иметь предложения where. Например, вы можете создавать индексы для каждого года на основе столбца даты
источник