【发布时间】:2011-08-30 14:37:29
【问题描述】:
我需要表中的 1 列来保存唯一的非空值或 NULL。 TSQL UNIQUE 约束将 2 NULLs 视为相等,因此我不能使列唯一。
处理这个问题的正确方法是什么?
在做了一些研究后,我发现了两种对我来说似乎正确的方法,但我无法确定哪种方法更好。
第一个不适用于所有情况:
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]);
当然,也可以使用触发器实现所需的功能,但我认为触发器解决方案会产生比上述任何方法更多的开销。
这种情况的最佳做法是什么?
感谢您的回答。
【问题讨论】:
标签: sql-server tsql sql-server-2008