为什么我不能在nvarchar(max)上设置约束?

时间:2009-07-26 12:42:54

标签: sql-server sql-server-2005

为什么我无法在nvarchar(max)列上创建约束? SQL Server不允许我对其设置唯一约束。但是,它允许我在nvarchar(100)列上创建唯一约束。

这两列都是NOT NULL。我有什么理由不能在nvarchar(max)列中添加约束吗?

3 个答案:

答案 0 :(得分:76)

nvarchar(max)实际上是与nvarchar(integer-length)不同的数据类型。它的特征更像是已弃用的text数据类型。

如果nvarchar(max)值变得太大,例如text,则会将存储在行之外(行被限制为最大8000字节)并指向它存储在行本身。您无法有效地索引这么大的字段,并且数据可以存储在其他地方这一事实会进一步使搜索和扫描索引变得复杂。
唯一约束要求强制执行索引,因此,SQL Server设计者决定禁止在其上创建唯一约束。

答案 1 :(得分:24)

因为MAX非常大(2 31 -1字节)并且如果服务器必须检查多兆字节大小的条目的唯一性,则可能导致服务器崩溃。

Create Index的文档中,我认为这也适用于唯一约束。

  

最大允许尺寸   组合索引值为900字节。

编辑:如果你真的需要唯一性,你可以通过计算数据的哈希并将其存储在唯一索引中来估计它。即使是大的哈希值也足够小以适应可索引的列。您必须弄清楚如何处理冲突 - 如果发现错误的冲突,可能会手动检查冲突并填充数据(更改哈希值)。

答案 2 :(得分:4)

唯一约束实际上是一个索引,而nvarchar(max)不能用作索引中的键。