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ą.
Występuje w innej tabeli ... lub w tym samym stole. –
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