我面临一个令人困惑的问题。如果您创建如下表格,则会收到错误:
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
)
任何人都可以帮我解释一下吗?
谢谢!
答案 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.