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

One thought on “Unique index

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *