2010-11-01 70 views
2

我正面临一个令人困惑的问题。如果你创建类似下面的表,你会得到一个错误:(TSQL)nvarchar(200)稀疏空列上的唯一索引

CREATE TABLE t 
(
a NVARCHAR(100) SPARSE 
       NULL UNIQUE 
) 

Msg 1919, Level 16, State 2, Line 1 
Column 'a' in table 't' is of a type that is invalid for use as a key column in an index. 
Msg 1750, Level 16, State 0, Line 1 
Could not create constraint. See previous errors. 

但是,如果你第一次创建表,那么像这样创建唯一索引,一切正常。

CREATE TABLE t 
(

a NVARCHAR(100) SPARSE 
       NULL 
) 

CREATE UNIQUE NONCLUSTERED INDEX t_a ON dbo.t 
(
a 
) 

任何人都可以帮我解释一下吗?

谢谢!

回答

2

我不知道为什么,但是从MSDN SPARSE columns

A sparse column cannot be part of a clustered index or a unique primary key index.

如今,走进猜想的土地......

它种是有道理的,因为唯一约束不能被过滤,而明确的索引可以。因此UNIQUE约束是不允许的,但是通过CREATE INDEX允许你有一个隐含的过滤器。

我也想说不允许聚簇索引,因为每一个非聚集索引指的是聚集索引+聚集索引必须是国内独一无二的,如果没有明确(“唯一标志”)。所以每一行都必须存在。

总之,你必须有独特的和/或聚集的东西:这将违背了使用稀疏的点...没有?

1

您正在试图做到这一点,但:

CREATE TABLE t 
( 
    a NVARCHAR(100) SPARSE NULL 
     CONSTRAINT t_a UNIQUE NONCLUSTERED (a) 
) 

...你不能创造很多NULL值在列的唯一索引。为此,您需要创建一个过滤索引。即

CREATE NONCLUSTERED INDEX t_a ON dbo.t(a) 
WHERE a IS NOT NULL 
0

这绝对是奇怪的是,你可以在一个单独的语句创建索引,但不能在表中创建。

原因可能是在稀疏列上创建唯一索引没有多大意义。稀疏列的整个点是有效地存储null,并且一个唯一索引只允许一行与null

insert t values (null) 
insert t values (null) 
--> 

Msg 2601, Level 14, State 1, Line 1 
Cannot insert duplicate key row in object 'dbo.t' with unique index 't_a'. 
The statement has been terminated.