Правильный способ реализации уникального ограничения, позволяющего использовать несколько значений NULL в SQL Server. - PullRequest
9 голосов
/ 22 мая 2011


Мне нужен 1 столбец в таблице для хранения уникальных ненулевых значений или NULL.Ограничение TSQL UNIQUE рассматривает 2 NULL s как равные, поэтому я не могу сделать столбец уникальным.
Как правильно решить эту проблему?
После некоторых исследований я нашел 2 метода, которые кажутся правильнымия, но я не могу определить, какой из них лучше.
Первый, который не применяется ко всем случаям:

CREATE TABLE test (id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
   null_or_unique_id INT, unique_key AS  
(CASE WHEN [null_or_unique_id] IS NULL THEN -(1)*[id] 
 ELSE [null_or_unique_id] END), UNIQUE(unique_key ));

Это работает, но требует, чтобы все допустимые значения null_or_unique_id были неотрицательными (в моем случае это нормально)
Второе:

 CREATE VIEW test_view WITH SCHEMABINDING AS
 SELECT [null_or_unique_id] FROM dbo.test WHERE [null_or_unique_id] IS NOT NULL;
 GO
 CREATE UNIQUE CLUSTERED INDEX byNullOrUniqueId 
 ON dbo.test_view([null_or_unique_id]);

Конечно, также возможно реализовать желаемую функциональность с помощью триггеров, но я думаю, что триггерное решение создаст больше издержек, чем любой из упомянутых выше.

Какова наилучшая практика для такого случая?
Спасибо за ваши ответы.

Ответы [ 3 ]

9 голосов
/ 22 мая 2011

4 способа:

  • Отфильтрованный индекс (SQL Server 2008) <- рекомендуется на основе ваших тегов </li>
  • Триггер (упоминается)
  • Индексированное представление (в вашем вопросе)
  • Уникальное ограничение / индекс с вычисляемым столбцом (в вашем вопросе)
2 голосов
/ 23 мая 2011

Нормализуй это.Переместите столбец в новую таблицу вместе с первичным ключом текущей таблицы.Сделайте столбец уникальным и не нулевым в новой таблице.Обнуляемые уникальные ограничения не имеют логического смысла и практически бесполезны.

2 голосов
/ 22 мая 2011

SQL 2008 позволяет вам определить отфильтрованный индекс - по существу, индекс с предложением WHERE - см. Ответ Фила Хаселдена на этот вопрос для ссылок MSDN и пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...