Jak tworzyć ograniczenia klucza obcego w SQL

Jeśli jesteś właścicielem przedsiębiorstwa, na pewno zetknąłeś się z wartością i potrzebą danych w swojej firmie. Posiadanie środków do przechowywania baz danych i manipulowania nimi zwiększa wartość firmy.

Bazy danych są zorganizowane w określonej konwencji i pozwalają na ustrukturyzowanie danych w połączeniach, co przybliża nas do relacyjnych baz danych, które jako forma zarządzania danymi zostały przyjęte od lat 70. XX wieku. A na dzisiejszym rynku relacyjne bazy danych są preferowane ze względu na ich możliwości podczas manipulowania danymi.

Chociaż istnieje wiele dostępnych relacyjnych baz danych, MySQL znalazł się w czołówce, zajmując drugie miejsce na świecie według Statista według stanu na styczeń 2022 r.

W serwerze SQL ograniczenia to predefiniowane reguły i ograniczenia wymuszane w jednej lub wielu kolumnach; są one powiązane z wartościami w kolumnie i pomagają w utrzymaniu integralności, dokładności i wiarygodności danych w określonych kolumnach.

Mówiąc najprościej, tylko dane, które spełniają regułę ograniczenia, są pomyślnie wstawiane do kolumny. Operacja wstawiania zostaje zakończona, jeśli dane nie spełniają kryteriów.

W tym poście zakładamy, że zetknąłeś się z relacyjnymi bazami danych, w szczególności – MySQL, i nie możesz się doczekać wzmocnienia swojej wiedzy w tej domenie. Na koniec podzielę się kilkoma wskazówkami dotyczącymi interakcji z ograniczeniami klucza obcego.

Główne ograniczenia klucza – podsumowanie

Tabela w języku SQL obejmuje kolumnę lub kilka zawierających kluczowe wartości, które precyzyjnie określają każdy wiersz w systemach. Kolumna lub kolumny zatytułowane klucz podstawowy (PK) tabeli pełnią rolę wymuszenia integralności encji tabeli. Ograniczenia klucza podstawowego gwarantują unikatowe dane i często są definiowane w kolumnie tożsamości.

Po określeniu ograniczeń klucza podstawowego dla tabeli, silnik bazy danych automatycznie narzuca unikatowość danych, generując unikalne indeksy dla każdej kolumny podstawowej. Klucze podstawowe oferują wyjątkową przewagę, gdy są używane w zapytaniach, zapewniając szybki dostęp do danych.

Jeśli ograniczenia klucza podstawowego są zdefiniowane w wielu kolumnach, jest to nazywane złożonym lub złożonym kluczem podstawowym. W tym przypadku każda kolumna klucza podstawowego może zawierać zduplikowane wartości. Jednak połączone wartości ze wszystkich kolumn w kluczu podstawowym muszą być unikalne.

Dobrym przykładem jest przypadek, w którym masz tabelę z kolumnami `id`, `names` i `age`. Kiedy zdefiniujesz ograniczenie klucza głównego na kombinacji `id` i `names`, możesz mieć zduplikowane instancje wartości `id` lub `names`. Mimo to każda kombinacja musi być unikalna, aby uniknąć zduplikowanych wierszy. Więc możesz mieć rekordy z `id=1` i `name=Walter` oraz `age-22” i `id=1`, `name=Henry` i `age=27`, ale nie możesz mieć innych rekordów z `id=1` i `name=Walter`, ponieważ kombinacja nie jest unikalna.

Oto kilka istotnych aspektów, o których należy wiedzieć:

  • Tabela zawiera tylko jedno ograniczenie klucza podstawowego.
  • Klucze podstawowe nie mogą przekraczać 16 kolumn i maksymalnej długości 900 znaków.
  • Indeksy generowane przez klucze podstawowe mogą zwiększać indeksy w tabeli. Jednak liczba indeksów klastrowanych w tabeli nie może przekroczyć 1, a liczba indeksów nieklastrowanych w tabeli jest ograniczona do 999.
  • Gdy klastrowane i nieklastrowane nie są określone dla kluczowego ograniczenia, klastrowane jest przyjmowane automatycznie.
  • Wszystkie kolumny zadeklarowane w ograniczeniu klucza podstawowego powinny być zdefiniowane jako inne niż null. Jeśli tak nie jest, wszystkie kolumny połączone w ograniczeniu mają automatycznie ustawioną możliwość zerowania na wartość niezerową.
  • Gdy klucze podstawowe są zdefiniowane w typie kolumny zdefiniowanej przez użytkownika w środowisku uruchomieniowym języka wspólnego (CLR), implementacja typu musi obsługiwać porządek binarny.
  • Ograniczenia klucza obcego — podsumowanie

    Klucz obcy (FK) obejmuje kolumnę lub kombinację kilku używanych do tworzenia i wiązania łącza między dwiema tabelami i zarządza danymi, które mają być przechowywane w tabeli klucza obcego.

    Odwołanie do klucza obcego pociąga za sobą utworzenie łącza między dwiema tabelami; gdy kolumna lub kolumny zawierające klucz podstawowy dla innej tabeli są przywoływane przez kolumnę lub kolumny w innej tabeli.

    W scenariuszu odniesienia do klucza obcego połączenie jest tworzone między dwiema tabelami, gdy kolumna lub kolumny zawierające klucze podstawowe w tabeli są odwoływane przez kolumny w innej.

    W praktycznym przypadku możesz mieć tabelę Sales.SalesOrderHeader z kluczem obcym prowadzącym do innej tabeli, Sales.Osoba, ponieważ istnieje logiczna relacja między sprzedawcami a zamówieniami sprzedaży.

    Tutaj SalesPersonID w kolumnie SalesOrderHeader łączy się z kolumną klucza podstawowego tabeli SalesPerson. Kluczem obcym tabeli SalesPerson jest kolumna SalesPersonID w SalesOrderHeader.

    Ta relacja definiuje regułę: wartość SalesPersonID nie może znajdować się w tabeli SalesOrderHeader, jeśli nie istnieje w tabeli SalesPerson.

    Tabela może odwoływać się do 253 innych kolumn i tabel jako kluczy obcych, alternatywnie nazywanych odwołaniami wychodzącymi. Od 2016 r. serwer SQL zwiększył liczbę tabel i kolumn, do których można się odwoływać w pojedynczej tabeli, zwanej również odwołaniami przychodzącymi, z 253 do 10 000. Wzrost ten wiąże się jednak z pewnymi ograniczeniami:

  • Odwołania do klucza obcego przekraczające 253 są dostępne tylko dla operacji DELETE DML. MERGE i UPDATE nie są obsługiwane.
  • Tabele z odniesieniami do klucza obcego mają maksymalnie 253 odniesienia do klucza obcego.
  • W przypadku indeksów magazynu kolumn, tabel zoptymalizowanych pod kątem pamięci i tabel partycjonowanych kluczy obcych odwołania do kluczy obcych są ograniczone do 253.
  • Jakie są zalety kluczy obcych?

    Jak wspomniano wcześniej, ograniczenia klucza obcego odgrywają zasadniczą rolę w ochronie integralności i spójności danych w relacyjnej bazie danych. Oto zestawienie powodów, dla których ograniczenia klucza obcego są niezbędne.

  • Integralność referencyjna — ograniczenia klucza obcego gwarantują, że każdy rekord tabeli podrzędnej odpowiada rekordowi tabeli podstawowej, zapewniając spójność danych w obu tabelach.
  • Zapobieganie osieroconym rekordom — jeśli usuniesz tabelę nadrzędną, ograniczenia klucza obcego zapewniają, że powiązana z nią tabela podrzędna również zostanie usunięta, zapobiegając wystąpieniom osieroconych rekordów, które mogłyby prowadzić do niespójności danych.
  • Poprawiona wydajność — ograniczenia klucza obcego zwiększają wydajność zapytań, umożliwiając systemowi zarządzania bazą danych optymalizację zapytań na podstawie relacji między tabelami.
  • Indeksy ograniczeń klucza obcego

    Ograniczenia klucza obcego nie tworzą automatycznie odpowiednich indeksów, takich jak podstawowy. Możesz ręcznie tworzyć indeksy dla ograniczeń klucza obcego; jest to korzystne z następujących powodów.

    • Kolumny klucza obcego są często używane w kryteriach łączenia podczas łączenia danych z powiązanych tabel w zapytaniach przez dopasowanie kolumn powiązanych z ograniczeniem. Indeksy pomagają bazie danych w znalezieniu powiązanych danych w obcej tabeli.
    • Jeśli zmienisz ograniczenia klucza podstawowego, zostaną one sprawdzone z obcymi w powiązanych tabelach.

    Tworzenie indeksów nie jest obowiązkowe. Nadal można łączyć dane z dwóch tabel bez określania ograniczeń dotyczących klucza podstawowego i obcego. Jednak dodanie ograniczeń klucza obcego optymalizuje tabele i łączy je w kwerendzie, która spełnia kryteria używania kluczy. Jeśli zmienisz ograniczenia klucza podstawowego, zostaną one sprawdzone z obcymi w powiązanych.

    Wskazówki dotyczące tworzenia ograniczeń klucza obcego w SQL

    Spędziliście już dużo czasu na spekulacjach; odpowiedział dlaczego. Zmieńmy naszą uwagę i zawęźmy ją do taktyki tworzenia ograniczeń klucza obcego; odpowiedz jak.

    Pole „Klucz obcy” w tabeli odnosi się do „Klucza podstawowego” innego. Tabela z kluczem podstawowym jest twoją tabelą nadrzędną. A tabela z kluczem obcym nazywana jest tabelą podrzędną. Zanurzmy się.

    Tworzenie klucza obcego podczas tworzenia tabeli

    Podczas tworzenia tabeli można również utworzyć ograniczenie klucza obcego, aby zachować integralność referencyjną. Oto jak to zrobić:

    CREATE TABLE orders (
        order_id INT PRIMARY KEY,
        customer_id INT,
        order_date DATE,
        FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    );

    Powyższy kod tworzy tabelę o nazwie „orders” z głównym kluczem całkowitym „order_id”, inną liczbą całkowitą „customer_id” i datą „order_date”. W takim przypadku ograniczenie KLUCZ ZAGRANICZNY jest dodawane do kolumny „identyfikator_klienta” i odwołuje się do „identyfikatora_klienta” w tabeli „klienci”.

    Tworzenie klucza obcego po utworzeniu tabeli

    Załóżmy, że utworzyłeś już tabelę i chcesz dodać ograniczenie klucza obcego; użyj instrukcji `ALTER TABLE` w swoim kodzie. Spójrz na fragment kodu poniżej.

    ALTER TABLE orders
    ADD FOREIGN KEY (customer_id) REFERENCES customers(customer_id);

    W tym przypadku dodano kolumnę „identyfikator_klienta” z ograniczeniem klucza obcego w tabeli „zamówienia”, aby odwoływać się do kolumny „identyfikator_klienta” w tabeli „klienci”.

    Tworzenie klucza obcego bez sprawdzania istniejących danych

    Po dodaniu ograniczenia klucza obcego do tabeli baza danych automatycznie sprawdza istniejące dane, aby zapewnić spójność z ograniczeniem. Jeśli jednak wiesz, że dane są spójne i chcesz dodać ograniczenie bez sprawdzania spójności, oto jak to zrobić.

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    NOT VALIDATE;

    Polecenie NOT VALIDATE informuje bazę danych, aby nie sprawdzała istniejących danych. Ten konkretny przypadek jest pomocny w określonych przypadkach. Na przykład, gdy masz ogromne ilości danych i chcesz zakończyć proces sprawdzania poprawności.

    Tworzenie klucza obcego za pomocą DELETE/UPDATE

    Tworząc ograniczenia klucza obcego, możesz kierować działaniami, które mają zostać podjęte w przypadkach, gdy odnośny wiersz zostanie zaktualizowany lub usunięty. W tym przypadku używasz kaskadowych ograniczeń integralności referencyjnej, aby dyktować działania, które należy podjąć. Zawierają:

    # 1. BEZ AKCJI

    Podobnie jak w przypadku wielu innych baz danych, reguła „BRAK AKCJI” jest domyślnym zachowaniem podczas tworzenia ograniczenia klucza obcego. Oznacza to, że po usunięciu lub zaktualizowaniu wiersza, do którego następuje odwołanie, nie zostanie podjęte żadne działanie.

    Aparat baz danych zgłasza błąd w przypadku naruszenia ograniczenia klucza obcego. Nie jest to jednak zalecane, ponieważ może prowadzić do problemów z integralnością referencyjną, ponieważ należy wymusić ograniczenie klucza obcego. Oto przykład, jak to zrobić:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;

    #2. KASKADA

    Reguła „KASKADA” to kolejna opcja dla akcji „ON DELETE” i „ON UPDATE” podczas tworzenia ograniczeń klucza obcego. Po wprowadzeniu oznacza to, że za każdym razem, gdy wiersz jest aktualizowany lub usuwany w tabelach nadrzędnych, wiersze, do których się odwołuje, są odpowiednio aktualizowane lub usuwane. Ta technika jest potężna przy utrzymywaniu integralności referencyjnej. Oto przykład:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE CASCADE
    ON UPDATE CASCADE;

    Należy być ostrożnym podczas korzystania z tej zasady, ponieważ może ona spowodować niepożądane konsekwencje, jeśli nie jest stosowana ostrożnie. Chciałbyś uniknąć przypadkowego usunięcia zbyt dużej ilości danych lub tworzenia odwołań cyklicznych. Dlatego używaj tej opcji tylko wtedy, gdy jest to konieczne i ostrożnie.

    Istnieje kilka zasad korzystania z KASKADY:

    • Nie można określić CASCADE, jeśli kolumna znacznika czasu jest częścią klucza obcego lub klucza odniesienia.
    • Jeśli twoja tabela ma wyzwalacz INSTEAD OF DELETE, nie możesz określić ON DELETED CASCADE.
    • Nie możesz określić ON UPDATE CASCADE, jeśli twoja tabela ma wyzwalacz INSTEAD OF UPDATE.

    #3. USTAW NULL

    Gdy usuniesz lub zaktualizujesz odpowiedni wiersz w tabeli nadrzędnej, wszystkie wartości tworzące klucz obcy zostaną ustawione na wartość null. Ta reguła ograniczenia wymaga, aby kolumny klucza obcego dopuszczały wartość null do wykonania i nie można jej określić dla tabel z wyzwalaczami INSTEAD OF UPDATE. Oto przykład, jak to zrobić.

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE SET NULL
    ON UPDATE SET NULL

    W tym przypadku ustawiłeś kolumnę klucza obcego „identyfikator_klienta” w tabeli „zamówienia” na wartość NULL, jeśli odpowiedni wiersz w tabeli „klienci” zostanie usunięty lub zaktualizowany.

    #4. USTAW DOMYŚLNE

    Tutaj ustawiasz wszystkie wartości, które sprawiają, że klucz obcy jest domyślny, pod warunkiem, że wiersz, do którego się odwołuje, w tabeli nadrzędnej zostanie zaktualizowany lub usunięty.

    To ograniczenie jest wykonywane, jeśli wszystkie kolumny klucza obcego mają definicje domyślne. Jeśli kolumna dopuszcza wartość null, jej wartość domyślna to NULL. Należy zauważyć, że tej opcji nie można określić dla tabel z wyzwalaczami INSTEAD OF UPDATE. Oto przykład:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE SET DEFAULT
    ON UPDATE SET DEFAULT;

    W powyższym przypadku ustawiłeś „identyfikator_klienta” w tabeli „zamówienia” na wartość domyślną, co ma miejsce, gdy odpowiedni wiersz w tabeli „klienci” zostanie usunięty lub zaktualizowany.

    Ostatnie słowa

    W tym przewodniku odświeżyłeś sobie ograniczenia klucza podstawowego i zagłębiłeś się w ograniczenia klucza obcego. Napotkałeś również kilka technik tworzenia ograniczeń klucza obcego. I chociaż istnieje wiele sposobów tworzenia ograniczeń klucza obcego, ten post rozwikłał metody.

    I mając nadzieję, że opanowałeś nowe techniki; nie jesteś ograniczony do ich łączenia. Na przykład metody ograniczeń CASCADE, SET NULL, SET DEFAULT i NO ACTION można łączyć w tabelach z relacjami referencyjnymi.

    Jeśli twoja tabela napotka BRAK AKCJI, powróci do innych reguł ograniczeń. W innych przypadkach akcja USUŃ może wywołać kombinację tych reguł, a reguła BRAK AKCJI zostanie uruchomiona jako ostatnia.

    Następnie sprawdź ściągawkę SQL.