Почему я не могу установить ограничение на nvarchar (max)?
Почему я не могу создать ограничение на столбец nvarchar(max)
? SQL Server не позволит мне установить на нем уникальное ограничение. Но это позволяет мне создать уникальное ограничение для столбца nvarchar(100)
.
Оба этих столбца NOT NULL
. Есть ли причина, по которой я не могу добавить ограничение в столбец nvarchar(max)
?
Ответы
Ответ 1
nvarchar(max)
- действительно другой тип данных из nvarchar(integer-length)
. Его характеристики больше похожи на устаревший тип данных text
.
Если значение nvarchar(max)
становится слишком большим, например text
, оно будет храниться вне строки (строка ограничена до 8000 байтов), а указатель на нее сохраняется в сама строка. Вы не можете эффективно индексировать такое большое поле и тот факт, что данные могут быть сохранены в другом месте, еще больше усложняет поиск и сканирование индекса.
Уникальное ограничение требует применения индекса, и в результате разработчики SQL Server решили запретить создание на нем уникального ограничения.
Ответ 2
Поскольку MAX действительно большой (2 31 -1 байты) и может привести к кризису сервера, если серверу пришлось проверять уникальность в записях размером в несколько мегабайт.
Из документации Создать индекс, я бы предположил, что это справедливо и для уникальных ограничений.
Максимально допустимый размер комбинированные значения индекса - 900 байт.
EDIT. Если вам действительно нужна уникальность, вы можете, возможно, приблизиться к ней, вычислив хэш данных и сохранив их в уникальном индексе. Даже большой хеш был бы достаточно мал, чтобы вписаться в индексируемую колонку. Вам нужно будет выяснить, как обрабатывать конфликты - возможно, вручную проверите на столкновении и поместите данные (изменение хэша), если обнаружено ошибочное столкновение.
Ответ 3
Единственное ограничение - это фактически индекс, а nvarchar (max) не может использоваться как ключ в индексе.