Я использую SQL Server 2005. Я хочу, чтобы значения в столбце были уникальными, но разрешили NULLS.
Мое текущее решение включает уникальный индекс для такого вида:
CREATE VIEW vw_unq WITH SCHEMABINDING AS
SELECT Column1
FROM MyTable
WHERE Column1 IS NOT NULL
CREATE UNIQUE CLUSTERED INDEX unq_idx ON vw_unq (Column1)
Есть идеи получше?
sql
sql-server
indexing
constraints
unique
Nuno G
источник
источник
Ответы:
Совершенно уверен, что вы не сможете этого сделать, так как это нарушает цель уникальности.
Однако у этого человека, похоже, есть достойная работа: http://sqlservercodebook.blogspot.com/2008/04/multiple-null-values-in-unique-index-in.html
источник
Используя SQL Server 2008, вы можете создать отфильтрованный индекс: http://msdn.microsoft.com/en-us/library/cc280372.aspx . (Я вижу, что Саймон добавил это как комментарий, но подумал, что он заслуживает своего собственного ответа, поскольку комментарий легко пропустить.)
Другой вариант - это триггер для проверки уникальности, но это может повлиять на производительность.
источник
create unique index UIX on MyTable (Column1) where Column1 is not null
ANSI_NULLS
это такON
, иначе вы получите ошибку при попытке вставить данные.Уловка с вычисляемым столбцом широко известна как "уничтожение нуля"; Мои записи кредитуют Стива Касса:
источник
Строго говоря, уникальный столбец (или набор столбцов), допускающий значение NULL, может иметь значение NULL (или запись NULL) только один раз, поскольку наличие одного и того же значения (включая NULL) более одного раза, очевидно, нарушает ограничение уникальности.
Однако это не означает, что концепция «уникальных столбцов, допускающих значение NULL» верна; чтобы фактически реализовать его в любой реляционной базе данных, мы просто должны иметь в виду, что такие базы данных предназначены для нормализации для правильной работы, а нормализация обычно включает добавление нескольких (не связанных с сущностями) дополнительных таблиц для установления отношений между сущностями .
Давайте рассмотрим базовый пример, рассматривающий только один «уникальный столбец, допускающий значение NULL», его легко расширить до большего количества таких столбцов.
Предположим, мы представляем информацию в виде такой таблицы:
Мы можем сделать это, отделив uniqnull и добавив вторую таблицу, чтобы установить связь между значениями uniqnull и the_entity (вместо того, чтобы иметь uniqnull «внутри» the_entity):
Чтобы связать значение uniqnull со строкой в the_entity, нам нужно также добавить строку в the_relation.
Для строк в the_entity не были связаны значения uniqnull (т.е. для тех, которые мы поместили бы NULL в the_entity_incorrect), мы просто не добавляем строку в the_relation.
Обратите внимание, что значения uniqnull будут уникальными для всех the_relation, а также обратите внимание, что для каждого значения в the_entity может быть не более одного значения в the_relation, поскольку первичный и внешний ключи на нем обеспечивают это.
Затем, если значение 5 для uniqnull должно быть связано с идентификатором the_entity, равным 3, нам необходимо:
И, если значение id равное 10 для the_entity не имеет аналога uniqnull, мы делаем только:
Чтобы денормализовать эту информацию и получить данные, которые могла бы содержать таблица типа the_entity_incorrect, нам необходимо:
Оператор «левого внешнего соединения» гарантирует, что все строки из the_entity появятся в результате, помещая NULL в столбец uniqnull, когда в the_relation нет соответствующих столбцов.
Помните, что любые усилия, потраченные в течение нескольких дней (или недель или месяцев) на разработку хорошо нормализованной базы данных (и соответствующих денормализационных представлений и процедур), сэкономят вам годы (или десятилетия) боли и потраченных впустую ресурсов.
источник