为什么我不能对nvarchar(max)进行约束?

为什么我不能在nvarchar(max)列上创build约束? SQL Server不会允许我把一个唯一的约束。 但是,它允许我在nvarchar(100)列上创build一个唯一的约束。

这两列都不是NOT NULL 。 是否有任何理由我不能添加约束到nvarchar(max)列?

nvarchar(max)实际上是与nvarchar(integer-length)不同的数据types。 它的特征更像是不赞成使用的text数据types。

如果nvarchar(max)值变得太大,如text ,它将被存储在行 (一行最多限制为8000字节),并且指向它的指针存储在行本身中。 你不能有效地索引这样一个大的领域,数据可以存储在其他地方的事实进一步复杂化search和扫描索引。
唯一的约束需要强制执行索引,因此SQL Serverdevise人员决定不允许在其上创build唯一约束。

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

从创build索引的文档,我会假设这也适用于独特的约束。

组合索引值的最大允许大小是900字节。

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

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