2010-03-14 15 views
76

Czy istnieje sposób określenia, na przykład 4 różnych wartości dla kolumny varchar w MS SQL Server 2008?Ograniczenie kolumny varchar() do określonych wartości?

Na przykład, muszę kolumnę o nazwie Frequency (varchar), który akceptuje tylko „Dzienny”, „Tygodniowy”, „Miesięczny”, „Roczne” jako możliwych wartości

Czy to możliwe, aby ustawić w SQL Server Management Studio podczas tworzenia tabeli?

+4

Jeśli można bezpiecznie założyć, że nie będzie więcej poprawnych wartości i będzie wiele wierszy w tabeli, zakodowałbym możliwe wartości w coś mniejszego i szybszego niż varchar(). – Wikser

Odpowiedz

93

Czy już patrzysz na dodanie check constraint w tej kolumnie, która ograniczyłaby wartości? Coś jak:

CREATE TABLE SomeTable 
(
    Id int NOT NULL, 
    Frequency varchar(200), 
    CONSTRAINT chk_Frequency CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')) 
) 
+2

Dziękuję - działało świetnie. Jedną małą zmianą, którą musiałem dokonać, było to, że "Frequency IN" również musiało być zawarte w nawiasach. Studio SQL Server nie polubiło go bez żadnego powodu. – Adam

+1

Czy ta wielkość ograniczenia sprawdza wielkość liter? – RWendi

+3

Myślę, że brakowało Ci śpiączki po czwartej linii 'Frequency varchar (200)' – BillOverFlow

45

Chcesz check constraint.

ograniczenia CHECK określenia prawidłowych wartości od logicznej wypowiedzi, które nie opiera się na danych w innej kolumnie. W przypadku przykładu zakres wartości kolumny płacowej może być ograniczony przez , tworząc ograniczenie CHECK, które pozwala na dostęp do danych w zakresie od od 15 000 do 100 000 USD. To zapobiega wprowadzaniu wynagrodzeń poza zwykły zakres płac.

Chcesz coś takiego:

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

Można również skontaktować się z wprowadzania ograniczeń funkcji skalarnych, jak opisano w linku powyżej, który jest jak wolę to zrobić.

+0

ta odpowiedź też była dobra .. dlaczego nie możemy zaakceptować więcej niż jednego !! :) – Adam

+1

Yup ten jest lepszy :), +1 za to –

4

Kiedy Edycja tabeli
Right Click -> Sprawdź Ograniczenia -> Dodaj -> wpisać coś takiego Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly') w dziedzinie ekspresji i dobre imię wymuszenie w (nazwa) pola.
Skończyłeś.

11

Osobiście bym go zakodować jako tinyint oraz:

  • Albo: zmienić go na tekst na kliencie, sprawdź ograniczenie między 1 a 4
  • Lub: użyć tabeli odnośników z klucza obcego

Przyczyny:

  • potrwa średnio 8 bajtów do przechowywania tekstu, 1 bajt dla t nieważne. Ponad miliony wierszy to zrobi różnicę.

  • Co z układaniem? Czy "Daily" jest taki sam jak "DAILY"? Potrzeba zasobów do tego rodzaju porównania.

  • Wreszcie, jeśli chcesz dodać "Dwutygodnik" lub "Godzinę"? Wymaga to zmiany schematu, gdy można dodać nowe wiersze do tabeli odnośników.

Powiązane problemy