УНИКАЛЬНОЕ ограничение SQL Server с повторяющимися значениями NULL

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

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

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

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

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

6 ответов

Решение

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

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

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

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

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

Если вы используете SQL Server 2008, изучите отфильтрованные индексы, чтобы достичь того, чего вы хотите.

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

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

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

Вот источник - Создание индексированных представлений

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

Другие вопросы по тегам