Ich habe einen Fehler bei
Column 'key' in table 'misc_info' is of a type that is invalid for use as a key column in an index.
Dabei ist der Schlüssel ein nvarchar (max). Eine schnelle Google fand dies . Es erklärt jedoch nicht, was eine Lösung ist. Wie erstelle ich so etwas wie ein Wörterbuch, bei dem der Schlüssel und der Wert beide Zeichenfolgen sind und der Schlüssel offensichtlich eindeutig und einfach sein muss? Meine SQL-Anweisung war
create table [misc_info] (
[id] INTEGER PRIMARY KEY IDENTITY NOT NULL,
[key] nvarchar(max) UNIQUE NOT NULL,
[value] nvarchar(max) NOT NULL);
Antworten:
Eine eindeutige Einschränkung darf nicht mehr als 8000 Byte pro Zeile betragen und verwendet auch dann nur die ersten 900 Byte. Die sicherste maximale Größe für Ihre Schlüssel wäre also:
Das heißt, der Schlüssel darf nicht länger als 450 Zeichen sein. Wenn Sie zu
varchar
anstatt wechseln könnennvarchar
(z. B. wenn Sie keine Zeichen von mehr als einer Codepage speichern müssen), kann dies zu 900 Zeichen führen.quelle
varchar(900)
ODER zu verwendennvarchar(450)
.ID1 int
in den Index aufnehmen. Dasint
erfordert 4 Bytes zusätzlich zu den 900 Bytes für dievarchar
.In SQL Server (bis 2008 R2) gibt es eine Einschränkung, dass varchar (MAX) und nvarchar (MAX) (und verschiedene andere Typen wie Text, ntext) nicht in Indizes verwendet werden können. Sie haben zwei Möglichkeiten:
1. Legen Sie eine begrenzte Größe für das Schlüsselfeld fest, z. nvarchar (100)
2. Erstellen Sie eine Prüfbedingung , die den Wert mit allen Schlüsseln in der Tabelle vergleicht. Die Bedingung ist:
und [dbo]. [CheckKey] ist eine Skalarfunktion, definiert als:
Beachten Sie jedoch, dass ein nativer Index leistungsfähiger ist als eine Prüfbedingung. Wenn Sie also keine Länge angeben können, verwenden Sie die Prüfbedingung nicht.
quelle
Die einzige Lösung besteht darin, weniger Daten in Ihrem eindeutigen Index zu verwenden. Ihr Schlüssel kann höchstens NVARCHAR (450) sein.
"SQL Server behält das 900-Byte-Limit für die maximale Gesamtgröße aller Indexschlüsselspalten bei."
Lesen Sie mehr bei MSDN
quelle
Eine Lösung wäre, Ihren Schlüssel als zu deklarieren
nvarchar(20)
.quelle
Wenn Sie den Kommentar von klaisbyskov zu Ihrer Schlüssellänge, die Gigabyte groß sein muss, zur Kenntnis nehmen und davon ausgehen, dass Sie dies tatsächlich benötigen, sind Ihre einzigen Optionen meiner Meinung nach:
Das Hashing ist mit der Einschränkung verbunden, dass Sie eines Tages eine Kollision bekommen könnten .
Trigger scannen die gesamte Tabelle.
Zu dir hinüber...
quelle