a1e*_*x07 10 t-sql sql-server sql-server-2008
我需要表中的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 ));
Run Code Online (Sandbox Code Playgroud)
它的工作原理但要求所有允许的值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]);
Run Code Online (Sandbox Code Playgroud)
当然,也可以使用触发器实现所需的功能,但我认为触发器解决方案将产生比上面提到的任何更多的开销.
这种情况的最佳做法是什么?
谢谢你的回答.
| 归档时间: |
|
| 查看次数: |
2507 次 |
| 最近记录: |