Уникальный ключ SQL Server 2005 с нулевым значением

У меня есть таблица в SQL Server 2005 с внешним ключом, и я хочу, чтобы этот внешний ключ был уникальным значением или нулевым. Я настроил его как уникальный ключ, но он не позволит мне иметь несколько нулей в одной таблице. Можно ли делать то, что я хочу?


person Curtis    schedule 12.05.2011    source источник


Ответы (4)


Это давняя жалоба на уникальные ограничения/индексы SQL Server. Лучшее решение — создать представление с привязкой схемы, а затем присвоить этому столбцу уникальный индекс:

Create View dbo.MyUniqueColView
With SchemaBinding
As
Select MyColToBeUnique
From MyTable
Where MyColToBeUnique Is Not Null

GO

Create Unique Clustered Index IX_MyTable_MyColToBeUnique On MyUniqueColView ( MyColToBeUnique )
person Thomas    schedule 12.05.2011

Вы не можете применить это с помощью ограничения на уровне таблицы в SQL Server 2005, но вы можете создать представление с определением SELECT Col FROM t WHERE Col IS NOT NULL, а затем создать для него уникальный кластеризованный индекс.

person Martin Smith    schedule 12.05.2011

В SQL Server 2008 можно было создать отфильтрованный индекс для значений, которые не равны нулю. К сожалению, это новая функция в версии 2008, поэтому в 2005 году я не в состоянии сделать что-либо подобное, я боюсь.

person marc_s    schedule 12.05.2011

Всегда вызывает у меня раздражение. Я предпочитаю «другую» интерпретацию стандарта.

См. Создание уникального ограничение, игнорирующее пустые значения в SQL Server. Он охватывает три различных подхода.

  1. Решение 1. Отфильтрованные индексы.

    Это кажется довольно распространенным, судя по другим ответам. Я не пробовал этот подход, хотя он требует SQL Server 2008.

  2. Решение 2. Ограничение на вычисляемый столбец

    Я использовал это, и это работает. Однако может потребоваться корректировка взаимосвязей и/или добавление вторичного неуникального покрытия с индексированием (одно для ограничения уникальности, одно для покрытия индекса).

  3. Решение 3. Ограничение проверки UDF (не рекомендуется)

    Ах, мощь TSQL (читай: что-то еще, с чем нужно иметь дело). Я не пошел по этому пути.

Удачного кодирования.

person Community    schedule 12.05.2011