Мне нужен 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]);
Конечно, также возможно реализовать желаемую функциональность с помощью триггеров, но я думаю, что триггерное решение создаст больше издержек, чем любой из упомянутых выше.
Какова наилучшая практика для такого случая?
Спасибо за ваши ответы.