2009-09-16 11 views

Odpowiedz

110

Nie dotyczy. Jest niejasne równoważne:

mycol VARCHAR(10) NOT NULL CHECK (mycol IN('Useful', 'Useless', 'Unknown')) 
+1

jak to zrobić w SSMS? – EgoPingvina

+0

@EgoPingvina: Powinieneś zapytać o to w pytaniu, a nie o komentarzu. – chaos

2
CREATE FUNCTION ActionState_Preassigned() 
RETURNS tinyint 
AS 
BEGIN 
    RETURN 0 
END 

GO 

CREATE FUNCTION ActionState_Unassigned() 
RETURNS tinyint 
AS 
BEGIN 
    RETURN 1 
END 

-- etc... 

Gdzie sprawy skuteczności, nadal używać wartości twardych.

68

Najlepszym rozwiązaniem, które znalazłem w tym przypadku, jest utworzenie tabeli odnośników z możliwymi wartościami jako klucz podstawowy i utworzenie klucza obcego do tabeli odnośników.

+7

Lepsze rozwiązanie z perspektywy łatwości obsługi niż ograniczenie kontroli przedstawione powyżej. – HLGEM

+14

To jest lepsze rozwiązanie niż emulatory - również w MySQL. –

+2

@ypercube Dlaczego jest również lepszy dla MySQL? – BenR

1

Znalazłem to interesujące podejście, gdy chciałem zaimplementować wyliczenia w SQL Server.

Podejście wymienione poniżej w linku jest dość fascynujące, biorąc pod uwagę wszystkie twoje bazy danych potrzeby enum mogą być spełnione z 2 centralne tabele.

http://blog.sqlauthority.com/2010/03/22/sql-server-enumerations-in-relational-database-best-practice/

+6

Jest to odmiana wzorca zapobiegawczego określana jako "jedna prawda (odnośnik) ". Właściwym podejściem jest posiadanie oddzielnej tabeli dla każdego typu wyliczeniowego i użycie obcych kluczy (jeśli potrzebujesz w ogóle sprawdzenia, co może nie dotyczyć "czystych" wyrażeń). –

+2

Komentarze na dołączonej stronie zapewniają dobrą kopię zapasową dla używania poszczególnych tabel dla każdego "wyliczenia", a nie to, co ta odpowiedź określa –

+4

To całkiem zabawne, jak większość ludzi słusznie odepchnie ten projekt, ale autor nazywa jego artykuł "Najlepszą praktyką" . –

Powiązane problemy