Ограничение SQL Server UNIQUE с дублирующимися NULL
Возможный дубликат:
Как создать уникальное ограничение, которое также допускает ошибки в sql-сервере.
У меня есть таблица, где мне нужно заставить столбец иметь уникальные значения.
Этот столбец должен быть нулевым, а по бизнес-логике должно быть разрешено несколько значений NULL, тогда как другие повторяющиеся значения не являются.
Ограничение SQL Server UNIQUE не подходит в этой ситуации, поскольку считает NULL регулярными значениями, поэтому оно будет отклонять дублирующие NULL.
В настоящее время уникальность стоимости предоставляется BLL, поэтому я не ищу грязный хак, чтобы заставить его работать.
Я просто хотел бы знать, есть ли чистое решение для принудительного применения этого ограничения в БД.
И да, я знаю, что могу написать триггер для этого: триггер - единственное решение? (или лучшее решение в любом случае?)
Ответы
Ответ 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
к вычисленному столбцу.
Ответ 4
http://www.sqlmag.com/article/articleid/98678/sql_server_blog_98678.html
will work only in Microsoft SQL Server 2008
Ответ 5
Вы можете создать представление, в котором вы выбираете только не нулевые значения и создаете на нем индекс.
Вот источник - Создание индексированных просмотров
Ответ 6
Вы должны использовать UNIQUEIDENTIFIER в этом столбце, может быть NULL, а также уникальным по определению.
Надеюсь, что это поможет.