2010-11-01 64 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.