Unique index

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:

ALTER TABLE table1
ADD cs_value AS CHECKSUM(value)

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 na wielkość liter oraz spację z prawej strony.

Unique index - Case insensitive

Promuj

What do you think?
Like Love Haha Wow Sad Angry

One thought on “Unique index

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *