Подтвердить что ты не робот

Ограничение SQL Server UNIQUE с дублирующимися NULL

Возможный дубликат:
Как создать уникальное ограничение, которое также допускает ошибки в sql-сервере.

У меня есть таблица, где мне нужно заставить столбец иметь уникальные значения. Этот столбец должен быть нулевым, а по бизнес-логике должно быть разрешено несколько значений NULL, тогда как другие повторяющиеся значения не являются.

Ограничение SQL Server UNIQUE не подходит в этой ситуации, поскольку считает NULL регулярными значениями, поэтому оно будет отклонять дублирующие NULL.

В настоящее время уникальность стоимости предоставляется BLL, поэтому я не ищу грязный хак, чтобы заставить его работать. Я просто хотел бы знать, есть ли чистое решение для принудительного применения этого ограничения в БД.

И да, я знаю, что могу написать триггер для этого: триггер - единственное решение? (или лучшее решение в любом случае?)

4b9b3361

Ответ 1

Если вы используете SQL Server 2008 (не работает для более ранней версии), существует концепция отфильтрованного индекса. Вы можете создать индекс в отфильтрованном подмножестве таблицы.

CREATE UNIQUE INDEX indexName ON tableName(columns) INCLUDE includeColumns 
WHERE columnName IS NOT NULL

Ответ 2

Дубликат этого вопроса?

Вычисленный трюк столбца широко известен как "нульбастер"; мои заметки кредитуют Стив Касс:

CREATE TABLE dupNulls (
pk int identity(1,1) primary key,
X  int NULL,
nullbuster as (case when X is null then pk else 0 end),
CONSTRAINT dupNulls_uqX UNIQUE (X,nullbuster)
)

Работает на SQL Server 2000. Вам может понадобиться ARITHABORT напр.

ALTER DATABASE MyDatabase SET ARITHABORT ON

Ответ 3

Если вы используете SQL Server 2008, просмотрите Filtered Indexes, чтобы достичь того, что вы хотите.

Для более старой версии SQL Server возможной альтернативой триггеру является вычисляемый столбец:

  • Создайте вычисленный столбец, который использует значение вашего уникального столбца, если он не NULL, в противном случае он использует значение столбца первичного ключа строки (или любой столбец, который будет уникальным).
  • Примените ограничение UNIQUE к вычисленному столбцу.

Ответ 6

Вы должны использовать UNIQUEIDENTIFIER в этом столбце, может быть NULL, а также уникальным по определению. Надеюсь, что это поможет.