J'ai une erreur à
Column 'key' in table 'misc_info' is of a type that is invalid for use as a key column in an index.
où key est un nvarchar (max). Un google rapide a trouvé ceci . Il n'explique cependant pas ce qu'est une solution. Comment puis-je créer quelque chose comme Dictionary où la clé et la valeur sont toutes deux des chaînes et, de toute évidence, la clé doit être unique et unique. Ma déclaration SQL était
create table [misc_info] (
[id] INTEGER PRIMARY KEY IDENTITY NOT NULL,
[key] nvarchar(max) UNIQUE NOT NULL,
[value] nvarchar(max) NOT NULL);
Réponses:
Une contrainte unique ne peut pas dépasser 8000 octets par ligne et n'utilisera que les 900 premiers octets, même alors, la taille maximale la plus sûre pour vos clés serait:
c'est-à-dire que la clé ne peut pas dépasser 450 caractères. Si vous pouvez passer à
varchar
au lieu denvarchar
(par exemple, si vous n'avez pas besoin de stocker des caractères de plus d'une page de codes), cela pourrait augmenter à 900 caractères.la source
varchar(900)
OUnvarchar(450)
.ID1 int
dans l'index. Celaint
nécessite 4 octets, en plus des 900 octets pour levarchar
.Il existe une limitation dans SQL Server (jusqu'en 2008 R2) selon laquelle varchar (MAX) et nvarchar (MAX) (et plusieurs autres types comme le texte, ntext) ne peuvent pas être utilisés dans les index. Vous avez 2 options:
1. Définissez une taille limitée sur le champ clé ex. nvarchar (100)
2. Créez une contrainte de vérification qui compare la valeur à toutes les clés de la table. La condition est:
et [dbo]. [CheckKey] est une fonction scalaire définie comme:
Mais notez qu'un index natif est plus performant qu'une contrainte de vérification, donc à moins que vous ne puissiez vraiment spécifier une longueur, n'utilisez pas la contrainte de vérification.
la source
La seule solution consiste à utiliser moins de données dans votre index unique. Votre clé peut être NVARCHAR (450) au maximum.
"SQL Server conserve la limite de 900 octets pour la taille totale maximale de toutes les colonnes de clé d'index."
En savoir plus sur MSDN
la source
Une solution serait de déclarer votre clé comme
nvarchar(20)
.la source
En notant le commentaire de klaisbyskov sur la longueur de votre clé devant être de gigaoctets, et en supposant que vous en avez réellement besoin, alors je pense que vos seules options sont:
Le hachage vient avec l'avertissement qu'un jour, vous pourriez avoir une collision.
Les déclencheurs analyseront la table entière.
À vous ...
la source