(TSQL)nvarchar(200)稀疏空列的唯一索引

时间:2010-11-01 05:05:39

标签: sql-server tsql

我面临一个令人困惑的问题。如果您创建如下表格,则会收到错误:

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
)

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

谢谢!

3 个答案:

答案 0 :(得分:2)

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

  

稀疏列不能是聚簇索引或唯一主键索引的一部分。

现在,进入猜想之地......

它有意义,因为无法过滤UNIQUE约束,而显式索引可以。因此,不允许使用UNIQUE约束,但允许通过CREATE INDEX获得隐含的过滤器。

我还说不允许聚簇索引,因为每个非聚集索引引用聚簇索引+聚簇索引必须在内部唯一(如果不是显式的)(“uniquifier”)。所以每一行都必须存在。

总而言之,你必须拥有独特和/或聚集的东西:这会破坏使用SPARSE的意义......不是吗?

答案 1 :(得分:1)

你正试图这样做,但是:

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

...您无法在具有许多NULL值的列上创建唯一索引。为此,您需要创建一个Filtered Index。即。

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

答案 2 :(得分:0)

您可以在单独的语句中创建索引,但在表create中不能创建索引,这一点很奇怪。

原因可能是在稀疏列上创建唯一索引没有多大意义。稀疏列的整个点是有效地存储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.