Создание частичной уникальности в таблице

Создание частичной уникальности в таблицеАвтор: Konstantin Kosinsky

Одной из рекомендуемых практик при построении базы данных, является задание максимального числа ограничений на данные средствами самой СУБД, т.к. не известно, что и как будет реализовано на уровне приложения и сколько этих приложений может быть. Важным ограничением, которое позволит отсечь много мусора является ограничение уникальности. Например, если у меня есть таблица проектов:

 

и я хочу обеспечить уникальность названия проекта, я сделаю так:

И тогда, для следующего запроса:

Первая строчка будет выполнена, а вторая вернет ошибку:
В результате, даже если будут баги в приложениях, то в таблицу 100% не попадут не уникальные проекты.
Но что делать если нужна только частичная уникальность. Например, таблица создается следующим образом:
и нужно обеспечить только уникальность актуальных проектов (то есть только тех для которых IsDeleted == 0). Ограничение уникальности здесь не поможет.
Вторым способом обеспечить уникальность столбца является создание уникального индекса. Точнее когда мы создаем UNIQUE CONSTRAINT индекс создается автоматом, при чем уникальный индекс.
Если выполнить следующий запрос, который вернет все индексы в таблице Projects:
То получим:
image
Хотя уникальный индекс можно создать и без создания UNIQUE CONSTRAINT.
Если ко всему этому добавит появившиеся в SQL Server 2008 фильтрованные индексы, то мы можем обеспечить частичную уникальность для имени проекта, следующим образом:
И теперь, если выполнить скрипт:
То первые три выражения пройдут, а последнее выдаст ошибку:
В результате названия актуальных проектов не могут дублироватся, а удаленные могут быть любыми.
Запись опубликована в рубрике Полезно и интересно. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Войти с помощью: