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