Klucz główny

Kolumna (lub zestaw kolumn) jednoznacznie identyfikująca każdy wiersz w tabeli. Nie może zawierać wartości pustych ani powtórzeń.

Klucz główny (ang. primary key) to kolumna lub zestaw kolumn, które jednoznacznie identyfikują każdy wiersz w tabeli. Z definicji ma dwie żelazne właściwości: jest unikalny (nie ma dwóch wierszy z tą samą wartością) i nie może być NULL (czyli pusty). Mówiąc po ludzku: to dowód osobisty rekordu. Każdy wiersz ma swój własny, niepowtarzalny i zawsze wypełniony.

Do czego to służy

Klucz główny pozwala bazie danych odróżnić jeden wiersz od drugiego, nawet jeśli reszta danych wygląda identycznie. Masz dwóch klientów o imieniu Jan Kowalski? Bez problemu, bo każdy ma inne id. Dzięki temu możesz precyzyjnie wskazać, który rekord chcesz zaktualizować albo usunąć, zamiast strzelać na oślep po nazwisku.

Klucz główny jest też punktem zaczepienia dla relacji między tabelami. Inne tabele odwołują się do niego przez klucz obcy (foreign key) — tak właśnie zamówienie wie, do którego klienta należy. Większość silników zakłada na kluczu głównym automatyczny indeks, więc wyszukiwanie po nim jest błyskawiczne.

Przykład z praktyki

W PostgreSQL czy MySQL typowa tabela wygląda tak:

CREATE TABLE users (id SERIAL PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, name VARCHAR(100));

Tutaj id rośnie automatycznie z każdym nowym wierszem (1, 2, 3…), więc nie musisz się martwić o ręczne nadawanie numerków. Możesz też mieć klucz złożony z kilku kolumn, np. w tabeli łączącej studentów z kursami: PRIMARY KEY (student_id, course_id) — wtedy unikalna musi być cała para, a nie pojedyncze kolumny.

Częste błędy i mity

  • Używanie danych biznesowych jako klucza — kuszące jest wziąć email albo PESEL, ale dane potrafią się zmieniać (klient zmienia email), a klucza głównego nie powinieneś ruszać. Bezpieczniej dać sztuczny surrogate key typu id.
  • Mylenie z UNIQUEUNIQUE też pilnuje niepowtarzalności, ale dopuszcza NULL i może być wiele takich ograniczeń w tabeli. Klucz główny jest tylko jeden.
  • Założenie, że id zawsze idzie po kolei bez dziur — przy wycofanych transakcjach albo skasowanych wierszach numery się przeskakują. To normalne, nie polegaj na ciągłości.

Pojęcia powiązane: klucz obcy (foreign key), klucz kandydujący (candidate key), klucz naturalny i sztuczny (natural / surrogate key), indeks, ograniczenie UNIQUE, normalizacja, AUTO_INCREMENT / SERIAL.