Tengo un error en
Column 'key' in table 'misc_info' is of a type that is invalid for use as a key column in an index.
donde key es un nvarchar (max). Un google rápido encontró esto . Sin embargo, no explica qué es una solución. ¿Cómo creo algo como Diccionario donde la clave y el valor son cadenas y obviamente la clave debe ser única y única? Mi declaración SQL fue
create table [misc_info] (
[id] INTEGER PRIMARY KEY IDENTITY NOT NULL,
[key] nvarchar(max) UNIQUE NOT NULL,
[value] nvarchar(max) NOT NULL);
Respuestas:
Una restricción única no puede superar los 8000 bytes por fila y solo utilizará los primeros 900 bytes, incluso así, el tamaño máximo más seguro para sus claves sería:
es decir, la clave no puede tener más de 450 caracteres. Si puede cambiar a en
varchar
lugar denvarchar
(por ejemplo, si no necesita almacenar caracteres de más de una página de códigos), eso podría aumentar a 900 caracteres.fuente
varchar(900)
ORnvarchar(450)
.ID1 int
en el índice. Esoint
requiere 4 bytes, además de los 900 bytes para elvarchar
.Existe una limitación en SQL Server (hasta 2008 R2) que varchar (MAX) y nvarchar (MAX) (y varios otros tipos como text, ntext) no pueden usarse en índices. Tiene 2 opciones:
1. Establecer un tamaño limitado en el campo clave ej. nvarchar (100)
2. Cree una restricción de verificación que compare el valor con todas las claves de la tabla. La condición es:
y [dbo]. [CheckKey] es una función escalar definida como:
Pero tenga en cuenta que un índice nativo es más eficaz que una restricción de verificación, por lo que, a menos que realmente no pueda especificar una longitud, no use la restricción de verificación.
fuente
La única solución es usar menos datos en su índice único. Su clave puede ser NVARCHAR (450) como máximo.
"SQL Server retiene el límite de 900 bytes para el tamaño total máximo de todas las columnas de clave de índice".
Más información en MSDN
fuente
Una solución sería declarar su clave como
nvarchar(20)
.fuente
Tomando nota del comentario de klaisbyskov sobre la longitud de la clave que debe tener un tamaño de gigabytes, y suponiendo que realmente lo necesite, creo que sus únicas opciones son:
Hashing viene con la advertencia de que un día, podría tener una colisión.
Los activadores escanearán toda la tabla.
A ti...
fuente