Mam błąd pod adresem
Column 'key' in table 'misc_info' is of a type that is invalid for use as a key column in an index.
gdzie klucz to nvarchar (max). Szybkie Google to znalazło . Nie wyjaśnia jednak, jakie jest rozwiązanie. Jak utworzyć coś takiego jak Dictionary, w którym klucz i wartość są ciągami i oczywiście klucz musi być unikalny i pojedynczy. Moje oświadczenie sql było
create table [misc_info] (
[id] INTEGER PRIMARY KEY IDENTITY NOT NULL,
[key] nvarchar(max) UNIQUE NOT NULL,
[value] nvarchar(max) NOT NULL);
Odpowiedzi:
Unikalne ograniczenie nie może przekraczać 8000 bajtów na wiersz i nawet wtedy będzie używać tylko pierwszych 900 bajtów, więc najbezpieczniejszy maksymalny rozmiar kluczy to:
tzn. klucz nie może mieć więcej niż 450 znaków. Jeśli możesz przełączyć się na
varchar
zamiastnvarchar
(np. Jeśli nie musisz przechowywać znaków z więcej niż jednej strony kodowej), może to wzrosnąć do 900 znaków.źródło
varchar(900)
LUBnvarchar(450)
.ID1 int
w indeksie. Żeint
wymaga 4 bajtów, w uzupełnieniu do 900 bajtów dlavarchar
.W SQL Server (do 2008 R2) istnieje ograniczenie, że varchar (MAX) i nvarchar (MAX) (oraz kilka innych typów, takich jak text, ntext) nie mogą być używane w indeksach. Masz 2 opcje:
1. Ustaw ograniczony rozmiar w polu klucza, np. nvarchar (100)
2. Utwórz ograniczenie sprawdzające, które porównuje wartość ze wszystkimi kluczami w tabeli. Warunkiem jest:
i [dbo]. [CheckKey] to funkcja skalarna zdefiniowana jako:
Pamiętaj jednak, że indeks natywny jest bardziej wydajny niż ograniczenie sprawdzające, więc jeśli naprawdę nie możesz określić długości, nie używaj ograniczenia sprawdzającego.
źródło
Jedynym rozwiązaniem jest użycie mniejszej ilości danych w unikalnym indeksie. Twój klucz może mieć najwyżej NVARCHAR (450).
„SQL Server zachowuje limit 900 bajtów dla maksymalnego całkowitego rozmiaru wszystkich kolumn klucza indeksu”.
Przeczytaj więcej w MSDN
źródło
Rozwiązaniem byłoby zadeklarowanie klucza jako
nvarchar(20)
.źródło
Zwracając uwagę na komentarz Klaisbyskova, że długość klucza musi wynosić gigabajty, i zakładając, że faktycznie tego potrzebujesz, myślę, że jedyne opcje to:
Haszowanie wiąże się z zastrzeżeniem, że pewnego dnia może dojść do kolizji.
Wyzwalacze skanują całą tabelę.
Do Ciebie...
źródło