2010-04-11 7 views
8

Jestem dość zdezorientowany różnicą między KLUCZEM ZAGRANICZNYM a ograniczeniem CHECK - wydaje mi się, że osiągam ten sam rezultat.Jaka jest różnica między czekiem a kluczem zagranicznym?

Mam na myśli, że mogę utworzyć tabelę i wymusić klucz obcy na innej tabeli, ale mogę utworzyć CHECK, aby zapewnić wartość w innej tabeli.

Jaka jest różnica i kiedy należy korzystać z jednej lub drugiej?

Odpowiedz

6

klucz obcy ograniczeniem zapewnia, że ​​pozycja nie istnieje w

EDIT innej tabeli

zgodnie prawidłowego komentarzu istnieje w innej tabeli ... lub tej samej tabeli. - Mark Byers

Ograniczenie kontroli zapewnia, że ​​wpis jest zgodny z pewną regułą.

CHECK Constraints

ograniczenia CHECK wymusić integralności domeny poprzez ograniczenie wartości, które są akceptowane przez kolumnę. Są podobne do ograniczeń FOREIGN KEY, ponieważ kontrolują wartości, które są umieszczane w kolumnie. Różnica polega na sposobie, w jaki określają one, które wartości są poprawne: WERSJA OBCEGO ograniczenia otrzymują listę prawidłowych wartości z innej tabeli, a ograniczenia CHECK określają poprawne wartości z wyrażenia logicznego, które nie jest oparte na danych w innej kolumnie.

+4

Występuje w innej tabeli ... lub w tym samym stole. –

+0

Ograniczenia sprawdzania określają ..., które nie są oparte na danych w innej kolumnie. Nie całkiem poprawne, ograniczenia sprawdzające mogą zawierać wiele kolumn (co najmniej w 10g). Lepiej jest powiedzieć "nie na podstawie danych z innej tabeli". – Juraj

2

Ograniczenie klucza obcego ma większą moc niż ograniczenie CHECK.
Ograniczenie klucza obcego oznacza, że ​​kolumna (w bieżącej tabeli) może zawierać tylko wartości już istniejące w kolumnie tabeli zagranicznej (która może zawierać tę samą tabelę, często wykonywaną dla danych hierarchicznych). Oznacza to, że w miarę jak lista wartości zmienia się - staje się większa lub mniejsza - nie ma potrzeby aktualizacji ograniczenia.

Ograniczenie sprawdzające nie może odwoływać się do kolumn poza bieżącą tabelą i nie może zawierać podkwerendy. Często wartości są zakodowane tak jak BETWEEN 100 and 999 lub IN (1, 2, 3). Oznacza to, że w miarę zmian sytuacji konieczne będzie każdorazowe aktualizowanie ograniczenia CHECK. Ponadto relacja klucza obcego jest widoczna na diagramie zależności encji (ERD), natomiast ograniczenie CHECK nigdy nie będzie. Zaletą jest to, że ktoś może odczytać ERD i skonstruować zapytanie z niego bez użycia wielu poleceń tabelowych DESC, aby wiedzieć, jakie kolumny są gdzie i co dotyczy tego, co zbudować odpowiednie połączenia.

Najlepszą praktyką jest użycie kluczy obcych (i tabel pomocniczych) jako pierwszych. Użyj ograniczeń CHECK jako kopii zapasowych w sytuacjach, w których nie można używać klucza obcego, a nie jako podstawowego rozwiązania do sprawdzania poprawności danych.

+2

Klucze obce nie muszą być klawiszami z jedną kolumną. –

1

To zależy od Twojego DBMS (którego nie podałeś), ale w pewnym sensie masz rację: ograniczenie na klucz obcy jest szczególnym przypadkiem ograniczenia sprawdzającego. Istnieją systemy DBMS, które nie pozwalają na formułowanie ograniczenia klucza obcego jako ograniczenia sprawdzającego.

Głównym zamiarem ograniczenia sprawdzającego jest opisanie warunków, które mają zastosowanie do pojedynczego wiersza w tabeli. Na przykład mam tabelę elementów (jak w wodorze, helu, ...) i symbole dla elementów są ograniczone, aby rozpocząć od wielkiej litery, po której następuje zero, jedna lub dwie małe litery (dwie małe litery dla jeszcze nieodkrytych, ale przewidywanych elementów: Uus - ununseptium (117) , który właśnie został wyizolowany, ale jeszcze nie został nazwany). Może to być przedmiotem ograniczenia CHECK:

CHECK(Symbol MATCHES "[A-Z][a-z]{0,2}") 

przy założeniu, że istnieje MECZ i obsługuje odpowiedni język wyrażeń regularnych.

Można również sprawdzić, czy ograniczenia porównania wartości:

CHECK(OrderDate <= ShipDate OR ShipDate IS NULL) 

wyrazić ograniczenie klucza obcego jako ograniczenie wyboru, trzeba być dopuszczone do wykonywania zapytania w klauzuli sprawdzenia. Hipotetycznie:

CHECK(EXISTS(SELECT * FROM SomeTable AS s 
       WHERE ThisTable.pk_col1 = s.pk_col1 AND 
        ThisTable.pk_col2 = s.pk_col2)) 

Ten przykład pokazuje niektóre z problemów. Nie mam wygodnego aliasu dla tabeli, w której piszę ograniczenie sprawdzające - założyłem, że jest to "ThisTable". Konstrukt jest gadatliwy. Zakładając, że klucz podstawowy na SomeTable jest deklarowana na kolumnach pk_col1 i pk_col2, następnie klauzuli FOREIGN KEY jest znacznie bardziej zwarty:

FOREIGN KEY (pk_col1, pk_col2) REFERENCES SomeTable 

Lub, jeśli przedstawieniu alternatywnego klucza, a nie klucz podstawowy:

FOREIGN KEY (pk_col1, pk_col2) REFERENCES SomeTable(ak_col1, ak_col2) 

To jest bardziej kompaktowe pod względem zapisu, więc ma mniejsze szanse na pomyłkę - i może być obsługiwane przez serwer specjalny, ponieważ specjalny zapis oznacza, że ​​ma do czynienia z ograniczeniem klucza obcego, podczas gdy klauzula ogólnego sprawdzania musi być zbadane, aby sprawdzić, czy pasuje do jednej z wielu możliwych form, które Odpowiednik klucza obcego.

Pytanie dotyczy pytania: kiedy należy użyć ograniczenia sprawdzającego i kiedy należy użyć ograniczenia klucza obcego?

  • Użyj wiązania CHECK, aby określić kryteria, które można sprawdzić w jednym wierszu.
  • Użyj ograniczenia klucza OBCEGO, aby określić, że wartości w bieżącym wierszu muszą być zgodne z wartościami wiersza w jakimś innym kluczu unikatowym (klucz kandydujący, zwykle klucz podstawowy, a nie klucz alternatywny) w niektórych tabelach - co może oznaczać być tym samym stołem lub (częściej) inną tabelą.
Powiązane problemy