Klucze główne i unikatowość
Poznaj klucze główne, klucze zastępcze i naturalne, klucze złożone oraz dowiedz się, dlaczego każdy wiersz potrzebuje wiarygodnego unikatowego identyfikatora.
Klucze główne i unikatowość to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Dlaczego każdy wiersz potrzebuje unikalnego identyfikatora
Aby bezpiecznie zaktualizować lub usunąć konkretny wiersz, trzeba móc jednoznacznie go wskazać.
- Może istnieć dwóch użytkowników o imieniu i nazwisku "Alice Adams"
- Nie może jednak istnieć dwóch użytkowników z
id = 42 - Unikalny identyfikator nazywa się kluczem głównym
Deklarowanie klucza głównego
Kolumnę oznacza się jako klucz główny podczas tworzenia tabeli:
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
sku VARCHAR(50) NOT NULL,
name VARCHAR(200) NOT NULL,
price NUMERIC(10,2) NOT NULL
);PRIMARY KEY = NOT NULL + UNIQUE
PRIMARY KEY automatycznie wymusza:
- NOT NULL — wartości klucza głównego nie mogą być puste
- UNIQUE — żadne dwa wiersze nie mogą mieć tej samej wartości klucza głównego
Baza danych tworzy również unikalny indeks klucza głównego, dzięki czemu wyszukiwanie po identyfikatorze jest szybkie.
Klucze zastępcze a naturalne
W przypadku klucza głównego są dwa możliwe rozwiązania:
- Zastępczy — sztuczny identyfikator generowany przez bazę danych (BIGSERIAL, UUID). Najczęściej stosowany we współczesnych aplikacjach.
- Naturalny — identyfikator pochodzący ze świata rzeczywistego (adres e-mail, ISBN). Ryzykowny, ponieważ adresy e-mail mogą się zmieniać.
Dobra praktyka: używać zastępczego identyfikatora i dodać ograniczenie UNIQUE dla klucza naturalnego.
BIGSERIAL: liczby całkowite zwiększane automatycznie
W PostgreSQL BIGSERIAL tworzy 64-bitową kolumnę zwiększaną automatycznie, opartą na sekwencji.
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
total NUMERIC(10,2) NOT NULL
);
-- You omit id on insert and the DB fills it in:
INSERT INTO orders (user_id, total) VALUES (7, 99.50);Klucze główne UUID
Alternatywą jest 128-bitowy identyfikator UUID, przydatny, gdy identyfikatory muszą być unikalne w wielu systemach lub generowane po stronie klienta.
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE sessions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id BIGINT NOT NULL,
ip INET
);Złożone klucze główne
Czasami naturalny identyfikator jest kombinacją kolumn:
CREATE TABLE order_items (
order_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
quantity INT NOT NULL,
PRIMARY KEY (order_id, product_id)
);
-- The pair (order_id, product_id) must be unique
-- A product can appear at most once per orderOgraniczenia UNIQUE a klucz główny
Można zadeklarować inne kolumny jako unikalne, nie czyniąc ich kluczem głównym:
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
username VARCHAR(50) UNIQUE
);
-- INSERT below fails on the second row:
INSERT INTO users (email, username) VALUES ('a@x.com', 'alice');
INSERT INTO users (email, username) VALUES ('a@x.com', 'bob'); -- ERRORCo się dzieje przy wstawieniu duplikatu
Jeśli spróbują Państwo wstawić zduplikowany klucz główny, baza danych odrzuci całą instrukcję:
ERROR: duplicate key value violates unique constraint "users_pkey" DETAIL: Key (id)=(42) already exists.
To dobrze — zapobiega niejawnemu uszkodzeniu danych.
Wyszukiwanie wierszy po kluczu głównym jest szybkie
Unikalny indeks klucza głównego zapewnia wyszukiwanie w czasie O(log n), nawet w tabelach zawierających miliardy wierszy.
-- Index Scan using users_pkey on users (cost=0.43..8.45 rows=1)
SELECT email FROM users WHERE id = 42;Nie używaj ponownie identyfikatorów
Nawet po usunięciu wiersza NIE należy ponownie używać jego klucza głównego. Inne tabele lub systemy zewnętrzne mogą nadal się do niego odwoływać. Należy pozwolić sekwencji nadal zwiększać wartości — identyfikatory są tanie.
Podsumowanie
Klucze główne zapewniają każdemu wierszowi stabilny, unikalny identyfikator.
- Preferuj klucze zastępcze (BIGSERIAL lub UUID)
- Używaj UNIQUE dla kluczy naturalnych, które nie mogą się powtarzać
- Złożone klucze główne odwzorowują regułę „ta para musi być unikalna”
Szybkie sprawdzenie
Co jest niejawnie wymuszane przez PRIMARY KEY?
Często zadawane pytania
Czy lekcja „Klucze główne i unikatowość” jest bezpłatna?
Tak — pełny tekst „Klucze główne i unikatowość” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Klucze główne i unikatowość”?
Poznaj klucze główne, klucze zastępcze i naturalne, klucze złożone oraz dowiedz się, dlaczego każdy wiersz potrzebuje wiarygodnego unikatowego identyfikatora. Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Klucze główne i unikatowość”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Czym jest RDBMS i dlaczego tabele mają znaczenie
- Klucze główne i unikatowość
- NULL: trzecia wartość logiczna
- Przegląd typów danych: INT VARCHAR DATE BOOLEAN