Уникальные ограничения на обнуляемые столбцы в SQL Server 2005


12

В этом одном проекте, над которым я работаю, мне нужно установить конкретное поле как уникальное (не проблема!), Но если поле пустое, я хочу, чтобы ограничение игнорировалось. В Sql Server 2008 я использую фильтрованный индекс, как показано ниже, но он недоступен в более ранних версиях SQL!

CREATE UNIQUE NONCLUSTERED INDEX User_UserName_IUC
ON [User] (pinNr)
WHERE UserName IS NOT NULL

Но я не думаю, что это доступно в SQL Server 2005. Фактически, этот пост в блоге указывает, что существует обходной путь, использующий триггер для проверки уникальности. У кого-нибудь есть пример этого? а может альтернатива?

К сожалению, обновление до SQl Server 2008 не подходит для этого конкретного клиента!

Ответы:


18

На самом деле, я должен был сделать что-то подобное один раз. Это включало создание вычисляемого столбца, который принимает значение столбца Unique, когда его нет, NULLи значение первичного ключа (с некоторой другой логикой, чтобы было невозможно конфликтовать со значениями в столбце уникальных значений), и создание уникального индекса в этот столбец. Вы можете увидеть пример этого и метод триггера здесь .


7

Вы можете создать представление (где имя пользователя не равно нулю), а затем добавить уникальный индекс к представлению. Вам никогда не понадобится использовать представление, оно просто существует для этого.

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


2
Индексированные представления не требуют корпоративной версии. Однако они требуют использования подсказки запроса WITH (NOEXPAND), чтобы заставить оптимизатор запросов стандартной редакции использовать индексированное представление вместо основного запроса.
Иеремия Пешка

3
В этом случае, однако, единственная точка зрения заключается в применении уникального ограничения, и это вполне допустимый / общий подход.
Мартин Смит

2
Отредактировано для удаления неверной информации о Enterprise Edition.
Meff

@Meff спасибо, что нашли время ответить на комментарии здесь - я надеюсь, что вы не будете чужим на сайте: вам могут быть интересны эти вопросы :)
Джек говорит, попробуйте topanswers.xyz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.