KWALIFIKACJA INF3 - CZERWIEC 2023

PYTANIE NR 29.
W bazie danych samochodów pole kolor z tabeli samochody przyjmuje wartości kolorów jedynie ze słownika lakier. Aby połączyć tabele samochody i lakier relacją należy, zastosować kwerendę
Ilustracja przedstawia cztery opcje zapytań SQL dotyczących modyfikacji struktury tabeli w bazie danych.
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Aby pole "kolor" w tabeli "samochody" mogło przyjmować wyłącznie wartości istniejące w tabeli-słowniku "lakier", należy wprowadzić integralność referencyjną.
Realizuje się to przez dodanie klucza obcego (FOREIGN KEY) wskazującego na klucz główny tabeli "lakier", zwykle poleceniem DDL typu ALTER TABLE.

Pełne wyjaśnienie:

Jeżeli kolumna kolor w tabeli samochody ma przyjmować wyłącznie wartości ze słownika (tabeli referencyjnej) lakier, to problemem jest ograniczenie dopuszczalnych wartości do tych, które faktycznie istnieją w tabeli słownikowej.

W relacyjnych bazach danych standardowym mechanizmem zapewniającym taką spójność jest integralność referencyjna, realizowana przez klucz obcy (FOREIGN KEY). Klucz obcy jest ograniczeniem na kolumnie/kolumnach tabeli podrzędnej (tu: samochody), które wymusza, że każda zapisana wartość musi mieć odpowiadający rekord w tabeli nadrzędnej (tu: lakier). Dzięki temu nie da się wprowadzić "zielonyyy" ani innego koloru, którego nie ma w słowniku.

Od strony SQL zwykle robi się to poleceniem DDL modyfikującym schemat, np. w stylu:

ALTER TABLE samochody ADD FOREIGN KEY (kolor) REFERENCES lakier(lakierId);

(Dokładna składnia i nazwy kolumn zależą od DBMS, ale idea jest ta sama: kolumna w "samochody" wskazuje na klucz w "lakier").

Dlaczego pozostałe typy rozwiązań bywają błędnym wyborem w takim pytaniu?

  • JOIN w SELECT "łączy" tabele tylko na czas odczytu danych, ale nie tworzy relacji/ograniczenia w schemacie i nie blokuje wpisania wartości spoza słownika.
  • UPDATE/INSERT mogą kopiować lub poprawiać dane, ale nie wprowadzają stałej reguły walidacji na przyszłość.
  • Indeks może przyspieszać wyszukiwanie, lecz nie wymusza, by wartość istniała w tabeli słownikowej.

W praktyce (aplikacje webowe, panel administracyjny) klucz obcy jest ważny, bo zabezpiecza dane nawet wtedy, gdy w aplikacji pojawi się błąd walidacji lub ktoś zapisuje dane innym narzędziem niż UI.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Klucz obcy to ograniczenie (constraint), które wymusza, aby wartość w kolumnie tabeli podrzędnej istniała jako klucz w tabeli nadrzędnej. Dzięki temu dane są spójne: nie zapiszesz wartości spoza słownika, a baza pilnuje integralności referencyjnej niezależnie od aplikacji.
Relację dodaje się przez zdefiniowanie klucza obcego w tabeli samochody, który wskazuje na klucz tabeli lakier. Zwykle używa się polecenia ALTER TABLE i dopisuje ograniczenie FOREIGN KEY z REFERENCES (składnia zależy od DBMS).
JOIN działa tylko w zapytaniu SELECT i łączy dane na potrzeby odczytu wyników. Nie zmienia schematu bazy i nie blokuje wstawienia błędnej wartości do kolumny. Jeśli celem jest narzucenie, by kolor pochodził ze słownika, potrzebujesz ograniczenia FOREIGN KEY.
Integralność referencyjna oznacza, że baza nie pozwoli dodać rekordu z odwołaniem do nieistniejącego wpisu w tabeli nadrzędnej. Przykładowo nie zapiszesz w tabeli samochody koloru, którego nie ma w tabeli lakier, dopóki nie dodasz go do słownika.
Najczęściej przechowuje się identyfikator (np. ID lakieru), a nie tekstową nazwę, bo to ułatwia zmiany nazw, zmniejsza ryzyko literówek i jest bardziej wydajne. Nazwę koloru pobiera się przez JOIN przy odczycie. Decyzja zależy od projektu, ale klucz obcy zwykle wskazuje na ID.
Częste błędy to: brak indeksu na kolumnie klucza obcego (spadek wydajności), błędne typy danych między kolumnami (niezgodne), wskazanie niewłaściwej kolumny w REFERENCES oraz próba dodania FOREIGN KEY, gdy w tabeli są już dane niespełniające reguły.
Gdy w tabeli podrzędnej istnieją rekordy z wartościami, które nie mają odpowiedników w tabeli nadrzędnej. Wtedy dodanie ograniczenia się nie powiedzie, dopóki nie poprawisz danych (np. usuniesz błędne wartości lub uzupełnisz tabelę słownikową) albo nie zmienisz mapowania.
DDL zmienia strukturę bazy (np. CREATE, ALTER, DROP) i dotyczy tabel, kluczy oraz ograniczeń. DML manipuluje danymi (np. SELECT, INSERT, UPDATE, DELETE). Jeśli pytanie mówi o utworzeniu relacji/ograniczenia między tabelami, prawie zawsze chodzi o DDL.
Można próbować walidacji w aplikacji, wyzwalaczy (triggerów) lub CHECK constraint, ale to zwykle mniej uniwersalne lub trudniejsze w utrzymaniu. Klucz obcy jest najprostszym, standardowym mechanizmem spójności między tabelami, zwłaszcza gdy kolor jest powiązany ze słownikiem.
Ćwicz na prostych schematach: tabela główna + tabela podrzędna + słownik. Wykonaj: tworzenie tabel, dodawanie PRIMARY KEY i FOREIGN KEY, próby wstawienia błędnych danych i interpretację komunikatów. Naucz się też czytać zadanie: czy chodzi o odczyt (JOIN), czy o definicję relacji (DDL).
info

To pytanie poprawnie rozwiązuje 47% zdających egzamin. trudne

Źródła:

  • MySQL 8.0 Reference Manual: "ALTER TABLE Statement" (sekcja o ADD FOREIGN KEY) - https://dev.mysql.com/doc/refman/8.0/en/alter-table.html - dostęp 2026-03-02
  • PostgreSQL Documentation: "ALTER TABLE" (sekcja o ADD CONSTRAINT ... FOREIGN KEY) - https://www.postgresql.org/docs/current/sql-altertable.html - dostęp 2026-03-02
  • Microsoft Learn: "FOREIGN KEY constraints (SQL Server)" - https://learn.microsoft.com/en-us/sql/relational-databases/tables/foreign-key-constraints - dostęp 2026-03-02

Materiały:

  • Dokumentacja SQL dla używanego DBMS: polecenie ALTER TABLE i ograniczenia FOREIGN KEY
  • Materiały o normalizacji i tabelach słownikowych w projektowaniu relacyjnych baz danych
  • Ćwiczenia: tworzenie relacji 1:N i testowanie błędów przy wstawianiu danych niezgodnych z kluczem obcym

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego