Loading...

Łukasz Kurzyniec

Portfolio

Unique index

Ilość komentarzy 1
niedziela, 19 czerwiec 2011
Może wydarzyć się sytuacja, że zajdzie konieczność utworzenia unikalnego klucza na kolumnie typu tekstowego (CHAR lub VARCHAR). W tym momencie warto nadmienić, iż każdy znak zajmie wtedy 1 bajt. Jeśli zaś będzie to typ danych unicode (NCHAR lub NVARCHAR), to znak zapisany będzie na 2 bajtach pamięci. Dlaczego o tym wspominam? Ponieważ jeśli wielkość indeksu przekroczy magiczną granicę 900 bajtów pojawia się Error 1946: "Operation failed. The index entry of length 1000 bytes for the index 'UQ_table1' exceeds the maximum length of 900 bytes."

Unique index - Error 1946

Jak wybrnąć z zaistniałej sytuacji? Sposobów jest kilka. Moim zdaniem najprostszym rozwiązaniem jest dodanie kolumny, która będzie przechowywać sumę kontrolną (CHECKSUM()) wartości kolumny znakowej o dużej długości: Po tej operacji unikalny indeks, który pragniemy utworzyć, opierać się będzie o kolumnę z wartością sumy kontrolnej, a nie o kolumnę z rzeczywistymi wartościami. Oczekiwany efekt zostaje osiągnięty, czego dowodem jest poniższy zrzut ekranu:

Unique index - Error on insert

Należy jednak uważać, ponieważ funkcja CHECKSUM() nie reaguje wielkość liter oraz spację z prawej strony.

Unique index - Case insensitive


Promuj


Komentarze { v0.4 }

bi
{ 2011-06-20 09:33:13 }
ciekawe, dzieki!