Подтвердить что ты не робот

Почему я не могу установить ограничение на nvarchar (max)?

Почему я не могу создать ограничение на столбец nvarchar(max)? SQL Server не позволит мне установить на нем уникальное ограничение. Но это позволяет мне создать уникальное ограничение для столбца nvarchar(100).

Оба этих столбца NOT NULL. Есть ли причина, по которой я не могу добавить ограничение в столбец nvarchar(max)?

4b9b3361

Ответ 1

nvarchar(max) - действительно другой тип данных из nvarchar(integer-length). Его характеристики больше похожи на устаревший тип данных text.

Если значение nvarchar(max) становится слишком большим, например text, оно будет храниться вне строки (строка ограничена до 8000 байтов), а указатель на нее сохраняется в сама строка. Вы не можете эффективно индексировать такое большое поле и тот факт, что данные могут быть сохранены в другом месте, еще больше усложняет поиск и сканирование индекса.
Уникальное ограничение требует применения индекса, и в результате разработчики SQL Server решили запретить создание на нем уникального ограничения.

Ответ 2

Поскольку MAX действительно большой (2 31 -1 байты) и может привести к кризису сервера, если серверу пришлось проверять уникальность в записях размером в несколько мегабайт.

Из документации Создать индекс, я бы предположил, что это справедливо и для уникальных ограничений.

Максимально допустимый размер комбинированные значения индекса - 900 байт.

EDIT. Если вам действительно нужна уникальность, вы можете, возможно, приблизиться к ней, вычислив хэш данных и сохранив их в уникальном индексе. Даже большой хеш был бы достаточно мал, чтобы вписаться в индексируемую колонку. Вам нужно будет выяснить, как обрабатывать конфликты - возможно, вручную проверите на столкновении и поместите данные (изменение хэша), если обнаружено ошибочное столкновение.

Ответ 3

Единственное ограничение - это фактически индекс, а nvarchar (max) не может использоваться как ключ в индексе.