sql-server - (TSQL) nvarchar(200) 稀疏空列上的唯一索引

标签 sql-server t-sql

我面临着一个令人困惑的问题。如果您创建如下所示的表,您将收到错误消息:

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
)

谁能帮我解释一下吗?

谢谢!

最佳答案

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

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

现在,进入猜想领域......

这有点有意义,因为 UNIQUE 约束无法被过滤,而显式索引可以。因此,UNIQUE 约束是不允许的,但可以通过 CREATE INDEX 允许,其中您有一个隐含的过滤器。

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

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

关于sql-server - (TSQL) nvarchar(200) 稀疏空列上的唯一索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4066753/

相关文章:

sql-server - 表中的所有列都将 SQL 字符串化

c# - SqlException (0x80131904) 连接到 mdf 数据库

sql - 查找两个不同时间线的时间重叠

sql-server - 我的计算字段的逻辑有什么问题(尝试计算百分比)?

sql - 如何在SQL Server 2005/8上获取类表查询结果?

sql - 是否可以在不循环的情况下比较 T-SQL 中的逗号分隔字符串?

c# - 使用 ormlite (SQL Server) 和 C# 中的存储过程删除和更新

sql - SQL Server中子查询末尾的 't'是什么意思

sql - 您如何找到一条链的原始 ID、第一个 ID 和最后一个 ID?

sql-server - 将 UDF 的语句加载到字符串变量中