Относится к типу, который недопустим для использования в качестве ключевого столбца в индексе

У меня ошибка в

Column 'key' in table 'misc_info' is of a type that is invalid for use as a key column in an index.

где ключ - nvarchar (max). Быстрый google нашел это. Однако он не объясняет, что такое решение. Как создать нечто вроде словаря, где ключ и значение являются строками, и, очевидно, ключ должен быть уникальным и единым. Моя заявка sql была

create table [misc_info] (
[id] INTEGER PRIMARY KEY IDENTITY NOT NULL,
[key] nvarchar(max) UNIQUE NOT NULL,
[value] nvarchar(max) NOT NULL);

Ответ 1

Уникальное ограничение не может превышать 8000 байт в строке и будет использовать только первые 900 байтов, поэтому максимальный максимальный размер для ваших ключей будет:

create table [misc_info]
( 
    [id] INTEGER PRIMARY KEY IDENTITY NOT NULL, 
    [key] nvarchar(450) UNIQUE NOT NULL, 
    [value] nvarchar(max) NOT NULL
)

то есть. ключ не может быть более 450 символов. Если вы можете переключиться на varchar вместо nvarchar (например, если вам не нужно хранить символы из более чем одной кодовой страницы), это может увеличиться до 900 символов.

Ответ 2

В SQL Server существует ограничение (до 2008 R2), что varchar (MAX) и nvarchar (MAX) (и несколько других типов, таких как text, ntext) не могут использоваться в индексах. У вас есть 2 варианта:
1. Установите ограниченный размер в поле ключа ex. NVARCHAR (100)
2. Создайте контрольное ограничение, которое сравнивает значение со всеми ключами в таблице. Условие:

([dbo].[CheckKey]([key])=(1))

и [dbo]. [CheckKey] - это скалярная функция, определенная как:

CREATE FUNCTION [dbo].[CheckKey]
(
    @key nvarchar(max)
)
RETURNS bit
AS
BEGIN
    declare @res bit
    if exists(select * from key_value where [key] = @key)
        set @res = 0
    else
        set @res = 1

    return @res
END

Но обратите внимание, что собственный индекс более эффективен, чем контрольное ограничение, поэтому, если вы действительно не можете указать длину, не используйте ограничение проверки.

Ответ 3

Единственное решение - использовать меньше данных в своем уникальном индексе. Ваш ключ может быть максимум NVARCHAR (450).

"SQL Server сохраняет 900-байтовый предел для максимального общего размера всех столбцов столбца индекса".

Подробнее на MSDN

Ответ 4

Решение заключалось бы в том, чтобы объявить ваш ключ как nvarchar(20).

Ответ 5

Отмечая комментарий klaisbyskov о вашей длине ключа, которая должна быть размером в гигабайт, и предполагая, что вы действительно нуждаетесь в этом, я думаю, что ваши единственные варианты:

  • используйте хэш значения ключа
    • Создайте столбец на nchar (40) (например, для хэша sha1),
    • поместите уникальный ключ в хэш-столбец.
    • генерировать хеш при сохранении или обновлении записи
  • запускает запрос к таблице для существующего соответствия при вставке или обновлении.

Хеширование приходит с предостережением, что в один прекрасный день вы можете столкнуться.

Триггеры сканируют всю таблицу.

Для вас...