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).

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
INSERTustawiid = 5(bo podałeś jawnie), - drugi
INSERTustawiid = 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:
| Cecha | PRIMARY KEY | UNIQUE |
|---|---|---|
| Wartości unikalne | tak | tak |
Dopuszcza NULL | nie | tak (jeden lub więcej, zależnie od bazy) |
| Liczba w tabeli | tylko jeden | może być wiele |
| Tworzy indeks | tak (główny) | tak (zwykły unikalny) |
| Jest celem klucza obcego | tak (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 email są unikalne (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 naKlienci.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ć
NULLani 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ść:
- Analiza wymagań - zebranie informacji, co baza ma przechowywać,
- Projekt konceptualny - identyfikacja encji (klient, zamówienie) i związków (model ER),
- Projekt logiczny - przekształcenie modelu w tabele, kolumny, klucze główne i obce,
- Projekt fizyczny - wybór typów danych, indeksów, optymalizacja,
- 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).