Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't I put a constraint on nvarchar(max)?

nvarchar(max) is really a different data type from nvarchar(integer-length). It's characteristics are more like the deprecated text data type.

If nvarchar(max) value becomes too large, like text, it will be stored outside the row (a row is constrained to 8000 bytes maximum) and a pointer to it is stored in the row itself. You cannot efficiently index such a large field and the fact that data can be stored somewhere else further complicates searching and scanning the index.
A unique constraint requires an index to be enforced and as a result, SQL Server designers decided to disallow creating a unique constraint on it.


Because MAX is really big (231-1 bytes) and could lead to a server meltdown if the server had to check for uniqueness on multi-megabyte-sized entries.

From the documentation on Create Index, I would assume this holds true for unique constraints as well.

The maximum allowable size of the combined index values is 900 bytes.

EDIT: If you really needed uniqueness, you could, potentially approximate it by computing a hash of the data and storing that in a unique index. Even a large hash would be small enough to fit in an indexable column. You'd have to figure out how to handle collisions -- perhaps manually check on collisions and pad the data (changing the hash) if an errant collision is found.


A unique constraint is actually an index, and nvarchar(max) cannot be used as a key in an index.