Klucz główny w SQL

Słownik kwalifikacji INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Klucz główny (PRIMARY KEY) to pole lub zestaw pól, które jednoznacznie identyfikują każdy rekord w tabeli. Wartości klucza głównego nie mogą się powtarzać i nie mogą być puste (NULL).

Infografika przedstawiająca klucz główny w SQL: centralna tabela pracownicy z wyróżnioną kolumną id jako PRIMARY KEY ze złotą ikoną klucza.

W tabeli Klienci polem klucza głównego jest zazwyczaj kolumna id - każdy klient otrzymuje unikalny identyfikator, dzięki któremu można go odróżnić od pozostałych. Bez klucza głównego baza nie wie, który wiersz dotyczy którego klienta - dlatego każda tabela w relacyjnej bazie danych powinna mieć klucz główny.

Cechy klucza głównego

Klucz główny:

  • jednoznacznie identyfikuje rekord (każdy wiersz ma swoją unikalną wartość),
  • nie dopuszcza wartości NULL (musi mieć przypisaną wartość),
  • nie dopuszcza duplikatów (każda wartość może wystąpić tylko raz),
  • w tabeli może być tylko jeden klucz główny (ale może składać się z wielu kolumn - klucz złożony),
  • najczęściej jest liczbą całkowitą z automatycznym zwiększaniem wartości (AUTO_INCREMENT).

Definiowanie klucza głównego

Klucz główny definiuje się w instrukcji CREATE TABLE. Najczęstszy sposób - przy deklaracji kolumny:

CREATE TABLE Klienci (
    id INT PRIMARY KEY,
    imie VARCHAR(50),
    nazwisko VARCHAR(50),
    telefon VARCHAR(20)
);

Można też zdefiniować klucz główny po wszystkich kolumnach - to jedyny sposób na klucz złożony (klucz oparty na kilku kolumnach jednocześnie):

CREATE TABLE oceny (
    uczen_id INT,
    przedmiot_id INT,
    ocena INT,
    PRIMARY KEY (uczen_id, przedmiot_id)
);

W tym przykładzie kluczem głównym jest para (uczen_id, przedmiot_id) - ten sam uczeń może mieć wiele ocen z różnych przedmiotów, ale nie może mieć dwóch ocen z tego samego przedmiotu.

Atrybut AUTO_INCREMENT

AUTO_INCREMENT (w MySQL) lub IDENTITY (w MS SQL Server) sprawia, że baza danych automatycznie nadaje kolejne wartości kolumnie - programista nie musi ich podawać przy wstawianiu wierszy.

CREATE TABLE pracownicy (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    imie VARCHAR(50),
    nazwisko VARCHAR(50)
);

Po takim definiowaniu można wstawiać wiersze bez podawania id:

INSERT INTO pracownicy (imie, nazwisko) VALUES ('Anna', 'Kowalska');
-- id = 1

INSERT INTO pracownicy (imie, nazwisko) VALUES ('Jan', 'Nowak');
-- id = 2

INSERT INTO pracownicy (imie, nazwisko) VALUES ('Maria', 'Wisniewska');
-- id = 3

Baza sama wstawi kolejno 1, 2, 3....

Co się stanie, gdy podasz wartość id mimo AUTO_INCREMENT?

To częste pytanie egzaminacyjne. Załóżmy:

CREATE TABLE pracownicy (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    imie VARCHAR(50),
    nazwisko VARCHAR(50)
);

INSERT INTO pracownicy VALUES (5, 'Anna', 'Kowalska');
INSERT INTO pracownicy (imie, nazwisko) VALUES ('Jan', 'Nowak');

Wynik:

  • pierwszy INSERT ustawi id = 5 (bo podałeś jawnie),
  • drugi INSERT ustawi id = 6 (bo baza kontynuuje od ostatniej wartości, a nie od 1+1).

Próba ponownego wstawienia id = 5 zakończyłaby się błędem - duplikat klucza głównego.

Atrybut UNIQUE

UNIQUE jest podobny do klucza głównego - wymaga unikalności wartości, ale różni się od niego:

CechaPRIMARY KEYUNIQUE
Wartości unikalnetaktak
Dopuszcza NULLnietak (jeden lub więcej, zależnie od bazy)
Liczba w tabelitylko jedenmoże być wiele
Tworzy indekstak (główny)tak (zwykły unikalny)
Jest celem klucza obcegotak (najczęściej)tak (rzadziej)

Przykład:

CREATE TABLE uzytkownicy (
    id INT PRIMARY KEY AUTO_INCREMENT,
    login VARCHAR(30) UNIQUE,
    email VARCHAR(100) UNIQUE,
    haslo VARCHAR(255)
);

W tym kodzie:
- id to klucz główny (jeden w tabeli),
- login i emailunikalne (każdy użytkownik ma unikalny login i email),
- mimo unikalności login i email nie są kluczem głównym - identyfikacja rekordu odbywa się przez id.

Klucz główny a klucz obcy

Klucz główny pełni rolę "identyfikatora", do którego mogą się odwoływać inne tabele - poprzez klucz obcy (FOREIGN KEY).

   tabela KLIENCI                tabela ZAMOWIENIA
   +-----------+                 +-------------+
   | id (PK)   | <-------------- | klient_id   | (FK)
   | imie      |    relacja 1:N  | id (PK)     |
   | nazwisko  |                 | data        |
   +-----------+                 +-------------+
       jeden klient                 wiele zamowień
  • Klienci.id - klucz główny (PK),
  • Zamowienia.klient_id - klucz obcy (FK) wskazujący na Klienci.id.

Klucz główny znajduje się w tabeli po stronie "jeden" relacji, klucz obcy po stronie "wiele". Więcej o kluczach obcych przeczytasz w haśle Klucz obcy w SQL.

Relacje między tabelami

Klucz główny jest podstawą trzech głównych typów relacji w bazach danych:

  • 1:1 (jeden do jednego) - rzadko stosowana, klucz obcy jest jednocześnie kluczem głównym w tabeli powiązanej,
  • 1:N (jeden do wielu) - najczęstsza, klucz obcy umieszczony w tabeli po stronie "wiele",
  • N:M (wiele do wielu) - wymaga tabeli pośredniej z dwoma kluczami obcymi.

Klauzulą określającą powiązania między tabelami w MySQL jest FOREIGN KEY ... REFERENCES ....

Integralność danych

Klucz główny zapewnia dwa rodzaje integralności:

  • Integralność encji - każda tabela musi mieć klucz główny i jego wartości nie mogą być NULL ani powtarzać się,
  • Integralność referencyjna - jeśli inna tabela odwołuje się do klucza głównego (przez klucz obcy), wartości muszą istnieć w tabeli głównej.

Integralność referencyjna to zasada mówiąca, że wartość klucza obcego musi odpowiadać istniejącej wartości klucza głównego w tabeli docelowej. Bez kluczy głównych i obcych nie da się zapewnić tej integralności.

Klucz główny złożony (composite key)

Klucz główny może obejmować więcej niż jedną kolumnę - to klucz złożony. Stosuje się go w tabelach łączących (w relacjach N:M):

CREATE TABLE uczen_nauczyciel (
    uczen_id INT,
    nauczyciel_id INT,
    PRIMARY KEY (uczen_id, nauczyciel_id),
    FOREIGN KEY (uczen_id) REFERENCES uczniowie(id),
    FOREIGN KEY (nauczyciel_id) REFERENCES nauczyciele(id)
);

Para (uczen_id, nauczyciel_id) musi być unikalna - jeden uczeń może być przypisany do jednego nauczyciela tylko raz. Każda kolumna osobno nie musi być unikalna (uczeń może mieć wielu nauczycieli i vice versa), ale kombinacja musi się różnić.

Klucz naturalny a klucz sztuczny

Klucze główne dzielimy na dwa rodzaje:

  • Klucz naturalny - wartość pochodząca z dziedziny biznesowej, np. PESEL, numer NIP, kod pocztowy. Zaleta: ma znaczenie biznesowe. Wada: może się zmieniać, długi, mało wydajny.
  • Klucz sztuczny (surogat) - sztucznie wygenerowana wartość, najczęściej liczba całkowita z AUTO_INCREMENT. Zaleta: krótki, szybki, niezmienny. Wada: bez znaczenia biznesowego.

W praktyce częściej używa się kluczy sztucznych - są wydajniejsze i bardziej elastyczne.

Fazy projektowania relacyjnej bazy danych

Klucze główne powstają w trakcie projektowania bazy. Typowa kolejność:

  1. Analiza wymagań - zebranie informacji, co baza ma przechowywać,
  2. Projekt konceptualny - identyfikacja encji (klient, zamówienie) i związków (model ER),
  3. Projekt logiczny - przekształcenie modelu w tabele, kolumny, klucze główne i obce,
  4. Projekt fizyczny - wybór typów danych, indeksów, optymalizacja,
  5. Implementacja - utworzenie tabel (CREATE TABLE), wstawianie danych, testowanie.

Pełny przykład - sklep internetowy

-- Tabela klientów - id jako klucz główny z AUTO_INCREMENT
CREATE TABLE klienci (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    imie VARCHAR(50),
    nazwisko VARCHAR(50),
    email VARCHAR(100) UNIQUE
);

-- Tabela produktów - sztuczny klucz główny
CREATE TABLE produkty (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    nazwa VARCHAR(100) NOT NULL,
    cena DECIMAL(8,2)
);

-- Tabela zamówień - klucz główny + klucz obcy do klientów
CREATE TABLE zamowienia (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    klient_id INT,
    data_zamowienia DATE,
    FOREIGN KEY (klient_id) REFERENCES klienci(id)
);

-- Tabela łącząca zamówienia z produktami (relacja N:M)
-- Tu klucz główny jest złożony
CREATE TABLE zamowienie_produkt (
    zamowienie_id INT,
    produkt_id INT,
    ilosc INT,
    PRIMARY KEY (zamowienie_id, produkt_id),
    FOREIGN KEY (zamowienie_id) REFERENCES zamowienia(id),
    FOREIGN KEY (produkt_id) REFERENCES produkty(id)
);

W tym przykładzie zastosowano wszystkie poznane elementy: PRIMARY KEY, AUTO_INCREMENT, UNIQUE, FOREIGN KEY, klucz złożony i relację N:M przez tabelę pośrednią.

Najczęstsze pytania egzaminacyjne o klucz główny

Co robi klauzula PRIMARY KEY w CREATE TABLE?
Sprawia, że dane pole staje się kluczem głównym - jego wartości muszą być unikalne i nie mogą być NULL.

Co musi mieć każda tabela, aby baza danych działała poprawnie?
Klucz główny (PRIMARY KEY) - jednoznacznie identyfikuje każdy rekord.

Czy klucz główny może być NULL?
Nie. Klucz główny zawsze musi mieć wartość.

Czy w jednej tabeli może być więcej niż jeden klucz główny?
Nie, jeden klucz główny na tabelę. Może on jednak składać się z wielu kolumn - to klucz złożony.

Co oznacza AUTO_INCREMENT?
Atrybut, który sprawia, że baza danych automatycznie nadaje kolejne wartości liczbowe nowym wierszom (1, 2, 3...).

Co robi atrybut UNIQUE w MySQL?
Wymusza, aby wartości w kolumnie były unikalne (różne dla każdego wiersza), ale w odróżnieniu od PRIMARY KEY dopuszcza wartość NULL. Można mieć wiele kolumn UNIQUE w jednej tabeli.

Co się stanie, gdy do tabeli z AUTO_INCREMENT wstawimy wiersz z konkretnym id, a następnie wiersz bez id?
Drugi wiersz dostanie id większe od ostatnio wstawionego, nie od 1. Jeśli pierwszy INSERT ustawił id = 5, drugi otrzyma id = 6.

Co to jest integralność referencyjna?
Zasada, że wartość klucza obcego musi odpowiadać istniejącej wartości klucza głównego w tabeli docelowej.

Jaka klauzula MySQL określa powiązania między tabelami?
Klauzula FOREIGN KEY ... REFERENCES ... - to klucz obcy odwołujący się do klucza głównego.

W której tabeli jest klucz obcy w relacji 1:N?
W tabeli po stronie "wiele". Klucz główny pozostaje w tabeli po stronie "jeden".

Jak utworzyć relację N:M?
Tworząc tabelę pośrednią z dwoma kluczami obcymi, najczęściej z kluczem głównym złożonym z obu tych kluczy.

Co zapamiętać na egzamin?

  • PRIMARY KEY = klucz główny, jednoznacznie identyfikuje wiersz.
  • Wartości klucza głównego: unikalne i nie NULL.
  • W tabeli może być tylko jeden klucz główny (ale może być złożony z wielu kolumn).
  • AUTO_INCREMENT = baza sama nadaje kolejne wartości (1, 2, 3...).
  • UNIQUE = unikalność jak w kluczu głównym, ale dopuszcza NULL i może być wiele kolumn UNIQUE.
  • Każda tabela w relacyjnej bazie powinna mieć klucz główny.
  • Klucz główny jest celem klucza obcego (FOREIGN KEY ... REFERENCES).
  • W relacji 1:N klucz główny jest po stronie "jeden", klucz obcy po stronie "wiele".
  • Relacja N:M wymaga tabeli pośredniej z dwoma kluczami obcymi.
  • Klucz sztuczny (AUTO_INCREMENT) jest częściej stosowany niż naturalny (np. PESEL).
  • Klauzula MySQL dla relacji: FOREIGN KEY ... REFERENCES tabela(kolumna).