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

42 sql-server sql-server-2005

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

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

Meh*_*ari 78

nvarchar(max)实际上是一种不同的数据类型nvarchar(integer-length).它的特征更像是不推荐使用的text数据类型.

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

  • 当然,他们可以使用CRC或MD5的版本来使约束成本低廉,以过高的概率进行检查.在任何情况下; 他们没有...... (5认同)

tva*_*son 24

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

创建索引的文档中,我认为这也适用于唯一约束.

组合索引值的最大允许大小为900字节.

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

  • 由于nvarchar使用两个字节来编码单个字符,因此nvarchar(450)是可以作为索引的最大值. (4认同)
  • 索引的所有键列的最大总大小为 900 字节。http://msdn.microsoft.com/en-us/library/ms191241.aspx (2认同)