FOREIGN KEY i akcje referencyjne
Łącz tabele za pomocą FOREIGN KEY i wybieraj właściwe zachowanie ON DELETE CASCADE / SET NULL / RESTRICT.
FOREIGN KEY i akcje referencyjne to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Działanie klucza obcego
FOREIGN KEY sprawia, że baza danych odrzuca wiersze wskazujące na nieistniejące rekordy nadrzędne:
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
total NUMERIC(10,2) NOT NULL
);
-- Inserting an order with user_id=999 fails if no such user exists.Po co używać kluczy obcych?
Klucze obce zapewniają integralność referencyjną:
- Brak osieroconych wierszy
- Wykrywanie błędów aplikacji podczas wstawiania
- Poprawność diagramów ER
- Obsługa automatycznego działania kaskadowego
Działania referencyjne
Co powinno się stać po usunięciu lub zaktualizowaniu wiersza nadrzędnego? Dostępnych jest pięć opcji:
NO ACTION— błąd (domyślnie, można odroczyć)RESTRICT— błąd (nie można odroczyć)CASCADE— również usuń lub zaktualizuj element podrzędnySET NULL— ustaw klucz obcy elementu podrzędnego na NULLSET DEFAULT— ustaw klucz obcy elementu podrzędnego na jego wartość domyślną
ON DELETE CASCADE
„Gdy użytkownik zostanie usunięty, usuń również jego zamówienia”:
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL
REFERENCES users(id) ON DELETE CASCADE,
total NUMERIC(10,2) NOT NULL
);ON DELETE SET NULL
„Gdy kierownik zostanie usunięty, pracownicy pozostają, ale tracą przypisanego kierownika”:
CREATE TABLE employees (
id BIGSERIAL PRIMARY KEY,
full_name TEXT NOT NULL,
manager_id BIGINT REFERENCES employees(id) ON DELETE SET NULL
);Domyślnie: podobnie jak RESTRICT
Bez działania referencyjnego próba usunięcia elementu nadrzędnego mającego elementy podrzędne kończy się błędem:
ERROR: update or delete on table "users" violates foreign key constraint "orders_user_id_fkey" on table "orders"
DETAIL: Key (id)=(42) is still referenced from table "orders".Zawsze indeksuj kolumnę klucza obcego
PostgreSQL NIE tworzy automatycznie indeksu po stronie elementu podrzędnego. Należy dodać go samodzielnie — bez niego usunięcie elementu nadrzędnego powoduje pełne skanowanie całej tabeli elementów podrzędnych:
CREATE INDEX orders_user_id_idx ON orders(user_id);Złożone klucze obce
Odwołanie do złożonego klucza głównego:
CREATE TABLE order_items (
order_id BIGINT,
line_no INT,
PRIMARY KEY (order_id, line_no)
);
CREATE TABLE shipments (
order_id BIGINT,
line_no INT,
FOREIGN KEY (order_id, line_no)
REFERENCES order_items(order_id, line_no)
);Odroczenie sprawdzania kluczy obcych
Czasami trzeba wstawić parę zależnych od siebie rekordów, których kolejność wzajemnie się wyklucza. Należy oznaczyć klucz obcy jako DEFERRABLE INITIALLY DEFERRED:
ALTER TABLE orders
ALTER CONSTRAINT orders_user_id_fkey DEFERRABLE INITIALLY DEFERRED;
BEGIN;
INSERT INTO orders ... ; -- FK temporarily not checked
INSERT INTO users ... ;
COMMIT; -- checked hereDodawanie kluczy obcych bez blokowania tabeli
W przypadku dużych tabel użyj NOT VALID + VALIDATE, aby uniknąć długotrwałej blokady:
ALTER TABLE orders
ADD CONSTRAINT orders_user_id_fkey
FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_id_fkey;Ostrożnie z CASCADE
Usuwanie kaskadowe propaguje się dalej. Usunięcie użytkownika może wymazać zamówienia, płatności i dzienniki audytowe. Należy upewnić się, że kaskada odpowiada intencjom biznesowym.
Podsumowanie
Klucze obce są zabezpieczeniami.
- REFERENCES + działanie deklaruje powiązanie i jego zachowanie
- Indeksuj kolumnę klucza obcego po stronie elementu podrzędnego
- Używaj NOT VALID + VALIDATE podczas dodawania ograniczeń bez blokowania tabeli
Szybki test
Jakie działanie referencyjne automatycznie usunie zamówienie po usunięciu nadrzędnego użytkownika?
Ucz się SQL dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 46
- Lekcje
- 183
Często zadawane pytania
Czy lekcja „FOREIGN KEY i akcje referencyjne” jest bezpłatna?
Tak — pełny tekst „FOREIGN KEY i akcje referencyjne” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „FOREIGN KEY i akcje referencyjne”?
Łącz tabele za pomocą FOREIGN KEY i wybieraj właściwe zachowanie ON DELETE CASCADE / SET NULL / RESTRICT. Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „FOREIGN KEY i akcje referencyjne”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Ograniczenia NOT NULL i CHECK
- Ograniczenia UNIQUE i klucze złożone
- FOREIGN KEY i akcje referencyjne
- Wartości DEFAULT i kolumny generowane