У меня есть таблица в SQL Server 2005 с внешним ключом, и я хочу, чтобы этот внешний ключ был уникальным значением или нулевым. Я настроил его как уникальный ключ, но он не позволит мне иметь несколько нулей в одной таблице. Можно ли делать то, что я хочу?
Уникальный ключ SQL Server 2005 с нулевым значением
Ответы (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 )
Вы не можете применить это с помощью ограничения на уровне таблицы в SQL Server 2005, но вы можете создать представление с определением SELECT Col FROM t WHERE Col IS NOT NULL
, а затем создать для него уникальный кластеризованный индекс.
В SQL Server 2008 можно было создать отфильтрованный индекс для значений, которые не равны нулю. К сожалению, это новая функция в версии 2008, поэтому в 2005 году я не в состоянии сделать что-либо подобное, я боюсь.
Всегда вызывает у меня раздражение. Я предпочитаю «другую» интерпретацию стандарта.
См. Создание уникального ограничение, игнорирующее пустые значения в SQL Server. Он охватывает три различных подхода.
Решение 1. Отфильтрованные индексы.
Это кажется довольно распространенным, судя по другим ответам. Я не пробовал этот подход, хотя он требует SQL Server 2008.
Решение 2. Ограничение на вычисляемый столбец
Я использовал это, и это работает. Однако может потребоваться корректировка взаимосвязей и/или добавление вторичного неуникального покрытия с индексированием (одно для ограничения уникальности, одно для покрытия индекса).
Решение 3. Ограничение проверки UDF (не рекомендуется)
Ах, мощь TSQL (читай: что-то еще, с чем нужно иметь дело). Я не пошел по этому пути.
Удачного кодирования.