Klucz złożony (ang. composite key) to klucz, który składa się z dwóch lub więcej kolumn naraz. Dopiero ich kombinacja jednoznacznie identyfikuje wiersz w tabeli — żadna z tych kolumn z osobna tego nie gwarantuje. Najczęściej spotkasz go jako klucz główny (PRIMARY KEY) zbudowany z kilku kolumn, ale dokładnie ta sama zasada dotyczy też kluczy obcych i unikalnych indeksów.
Sens jest prosty: czasem pojedyncza kolumna po prostu nie ma prawa być unikalna. Klasyczny przypadek to tabela łącząca w relacji wiele-do-wielu. Wyobraź sobie, że student może się zapisać na wiele kursów, a kurs ma wielu studentów. Tabela zapisy trzyma pary (student_id, kurs_id) i to właśnie ta para jest kluczem złożonym. Pojedynczy student_id się powtarza, pojedynczy kurs_id też — ale konkretna para występuje tylko raz. Dzięki temu baza sama pilnuje, żeby ten sam student nie zapisał się dwa razy na ten sam kurs.
Jak to wygląda w praktyce
W SQL definiujesz go jednym razem, wymieniając kolumny po przecinku. W PostgreSQL czy MySQL wygląda to tak:
CREATE TABLE zapisy (student_id INT, kurs_id INT, data_zapisu DATE, PRIMARY KEY (student_id, kurs_id));
Od tej chwili silnik bazy odrzuci próbę wstawienia drugiego wiersza z tą samą parą. Co ważne, kolejność kolumn w kluczu ma znaczenie dla indeksu: zapytania filtrujące po student_id skorzystają z indeksu, ale filtrowanie wyłącznie po kurs_id już niekoniecznie — bo to druga kolumna w kluczu.
Na co uważać
Najczęstszy zgrzyt pojawia się przy kluczach obcych. Jeśli inna tabela ma się odwoływać do twojego klucza złożonego, jej FOREIGN KEY musi powielić wszystkie kolumny klucza — to bywa upierdliwe i rozdmuchuje schemat. Dlatego wielu praktyków woli dodać sztuczny surrogate key (np. autonumerowane id) jako klucz główny, a parę kolumn zostawić jako UNIQUE. Dostajesz wtedy jedno i drugie: prostą referencję i wymuszoną unikalność.
Drugi mit: że klucz złożony „spowalnia bazę”. Sam w sobie nie — problemem jest dopiero szeroki klucz na wielu długich kolumnach tekstowych, bo taki indeks puchnie i obciąża każdą tabelę, która się do niego odwołuje.
Pojęcia powiązane: primary key, foreign key, surrogate key, klucz naturalny, unique constraint, indeks złożony, normalizacja, relacja wiele-do-wielu.