sql - tipos - es de un tipo que no es válido para usar como una columna clave en un índice
tamaño maximo de una base de datos en sql server (5)
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 la clave es un nvarchar (max). Un Google rápido encontró esto . Sin embargo, no explica qué es una solución. ¿Cómo creo algo como Dictionary donde la clave y el valor son ambas cadenas y, obviamente, la clave debe ser única y es ú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);
Al notar el comentario de klaisbyskov sobre la longitud de su clave que necesita ser de un tamaño de gigabytes, y suponiendo que realmente lo necesita, entonces creo que sus únicas opciones son:
- use un hash del valor clave
- Crea una columna en nchar (40) (para un hash sha1, por ejemplo),
- poner una clave única en la columna hash.
- generar el hash al guardar o actualizar el registro
- activadores para consultar la tabla de una coincidencia existente en la inserción o actualización.
Hashing viene con la advertencia de que algún día, es posible que tengas una colisión.
Los disparadores escanearán toda la mesa.
A ti...
Existe una limitación en SQL Server (hasta 2008 R2) que varchar (MAX) y nvarchar (MAX) (y varios otros tipos como text, ntext) no se pueden usar en índices. Tienes 2 opciones:
1. Establezca un tamaño limitado en el campo clave ex. 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:
([dbo].[CheckKey]([key])=(1))
y [dbo]. [CheckKey] es una función escalar definida como:
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
Pero tenga en cuenta que un índice nativo es más eficiente que una restricción de verificación, de modo que a menos que realmente no pueda especificar una longitud, no use la restricción de verificación.
La única solución es usar menos datos en su Índice Único. Su clave puede ser NVARCHAR (450) como máximo.
"SQL Server conserva el límite de 900 bytes para el tamaño total máximo de todas las columnas de clave de índice".
Lea más en MSDN
Una restricción única no puede superar los 8000 bytes por fila y solo usará los primeros 900 bytes, incluso entonces, por lo que el tamaño máximo más seguro para sus claves sería:
create table [misc_info]
(
[id] INTEGER PRIMARY KEY IDENTITY NOT NULL,
[key] nvarchar(450) UNIQUE NOT NULL,
[value] nvarchar(max) NOT NULL
)
es decir, la clave no puede tener más de 450 caracteres. Si puede cambiar a varchar en lugar de nvarchar (por ejemplo, si no necesita almacenar caracteres de más de una página de códigos), entonces podría aumentar a 900 caracteres.
Una solución sería declarar su clave como nvarchar(20)
.