С SQL Server я хочу уникальный индекс только для ненулевых значений

Возможный дубликат:
УНИКАЛЬНОЕ ограничение SQL Server с повторяющимися значениями NULL

В Sql Server я хотел бы иметь столбец, который имеет как нулевые, так и реальные значения. Если столбец имеет значение, я хочу убедиться, что он уникален. Столбец может иметь несколько строк с нулевым значением для этого столбца.

Например, предположим, что у меня была таблица книг с 3 столбцами, а именно:

Book Number - identity
Title - varchar
ISBN - char

Теперь у таблицы будет первичный ключ со столбцом идентификаторов, и это хорошо. Вопрос будет на колонке ISBN. Я не хочу, чтобы какой-либо номер ISBN появлялся в таблице более одного раза, но будет много книг без номера ISBN (так как я его не знаю).

Есть ли способ (или каков наилучший способ) сообщить об этом ограничении на ISBN?

1 ответ

Решение

В SQL Server 2008 вы можете создать отфильтрованный индекс, например:

CREATE UNIQUE INDEX indexName ON tableName(isbn) WHERE isbn IS NOT NULL

В более ранних версиях создайте вычисляемый столбец, который является ISBN, когда он существует, и первичным ключом, когда ISBN равен нулю:

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

Скопировано из уникального ограничения SQL Server с дублирующимися значениями NULL, так что это в режиме вики:)

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