Ograniczyć kolumnę varchar () do określonych wartości?

96

Czy istnieje sposób, aby określić na przykład 4 różne wartości dla kolumny varchar w MS SQL Server 2008?

Na przykład potrzebuję kolumny Częstotliwość (varchar), w której dopuszczalne są tylko wartości „Codziennie”, „Co tydzień”, „Miesięcznie”, „Rocznie”

Czy można to ustawić w SQL Server Management Studio podczas tworzenia tabeli?

Adam
źródło
5
Jeśli można bezpiecznie założyć, że nie będzie więcej prawidłowych wartości i będzie wiele wierszy w tabeli, zakoduję możliwe wartości w czymś mniejszym i szybszym niż varchar ().
Wikser

Odpowiedzi:

129

Czy spojrzałeś już na dodanie check constraintw tej kolumnie znaku, który ograniczyłby wartości? Coś jak:

CREATE TABLE SomeTable
(
   Id int NOT NULL,
   Frequency varchar(200),
   CONSTRAINT chk_Frequency CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))
)
Ashish Gupta
źródło
2
Dziękuję - to działało świetnie. Jedną małą zmianą, którą musiałem wprowadzić, było to, że „Frequency IN…” również musiało być ujęte w nawiasach. Studio SQL Server nie polubiło tego bez powodu.
Adam,
1
Czy w tym sprawdzaniu ograniczeń rozróżniana jest wielkość liter?
RWendi
3
Myślę, że przegapiłeś śpiączkę po czwartej liniiFrequency varchar(200)
BillOverFlow
RWendi - domyślne sortowanie w SQL Server nie uwzględnia wielkości liter, co ma zastosowanie na poziomie bazy danych. Więcej informacji tutaj stackoverflow.com/questions/1439485/…
jwoe
57

Chcesz ograniczenia sprawdzającego .

Ograniczenia typu CHECK określają prawidłowe wartości z wyrażenia logicznego, które nie jest oparte na danych w innej kolumnie. Na przykład zakres wartości kolumny wynagrodzenia można ograniczyć, tworząc ograniczenie CHECK, które zezwala tylko na dane z zakresu od 15 000 do 100 000 USD. Zapobiega to wpisywaniu wynagrodzeń poza normalny przedział płac.

Chcesz coś takiego:

ALTER TABLE dbo.Table ADD CONSTRAINT CK_Table_Frequency
    CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))

Możesz również zaimplementować ograniczenia sprawdzające za pomocą funkcji skalarnych, jak opisano w powyższym linku, a ja wolę to robić.

Michael Petrotta
źródło
1
ta odpowiedź też była dobra… dlaczego nie możemy zaakceptować więcej niż jednego !! :)
Adam
1
Tak, ten jest lepszy :), +1 za to
Owais Qureshi
12

Osobiście zakodowałbym to jako tinyint i:

  • Albo: zmień to na tekst na kliencie, sprawdź ograniczenie od 1 do 4
  • Lub: użyj tabeli przeglądowej z kluczem obcym

Powody:

  • Przechowywanie tekstu zajmie średnio 8 bajtów, a tinyint 1 bajt. W przypadku milionów wierszy będzie to miało znaczenie.

  • A co z zestawieniem? Czy „Daily” to to samo, co „DAILY”? Takie porównanie wymaga zasobów.

  • Na koniec, co zrobić, jeśli chcesz dodać „Co dwa tygodnie” lub „Co godzinę”? Wymaga to zmiany schematu, gdy wystarczy dodać nowe wiersze do tabeli odnośników.

gbn
źródło
5

Podczas edycji tabeli
Kliknij prawym przyciskiem myszy -> Sprawdź ograniczenia -> Dodaj -> Wpisz coś podobnego Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')do pola wyrażenia i dobrą nazwę ograniczenia w polu (Nazwa).
Skończyłeś.

Denis K.
źródło