Уникальный, необязательный столбец в SQL Server 2008 - PullRequest
1 голос
/ 26 августа 2010

При использовании SQL Server 2008 у меня есть требование, чтобы адреса электронной почты в моей таблице пользователей были уникальными, но адреса электронной почты не требуются в моем приложении. Я пытался сделать адреса электронной почты необходимыми, но я просто не могу заставить клиента выделить бюджет. Каков наилучший способ создать это ограничение?Если я добавлю ограничение, как оно будет выглядеть?Если я добавлю триггер перед вставкой, как это будет выглядеть?

Это приложение будет работать на многосерверной веб-ферме, и существует несколько точек входа.Уровень приложения lock() { } - не лучший вариант.Я делаю выборку и проверяю, что электронная почта не существует из кода прямо перед выполнением операции вставки, чтобы немедленно дать отзыв пользователю.Тем не менее, мне бы очень хотелось решение на уровне базы данных здесь.На всякий случай.

Я использую ORM (NHibernate с AutoMapping), поэтому я бы не стал вставлять или обновлять записи с помощью хранимой процедуры.

1 Ответ

3 голосов
/ 26 августа 2010

Использовать уникальный отфильтрованный индекс:

create table Foo (
 Id int not null identity(1,1) primary key
 , Name varchar(256) null
 , Address varchar(max) null
 , Email varchar(256) null);

create index ndxFooEmail unique on Foo(Email) 
 where Email is not null;

Это надежный 100% пуленепробиваемый способ гарантировать уникальность дополнительного значения. Уникальность будет на сервере базы данных, ваш ORM / DAL не должен беспокоиться об этом, просто обработайте ошибку, если нарушено уникальное ограничение, вместо того, чтобы пытаться дублировать ограничение в ORM / DAL (на самом деле это невозможно делать это правильно при одновременном использовании).

См. Рекомендации по проектированию отфильтрованных индексов для получения дополнительной информации о отфильтрованных индексах SQL Server 2008.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...