Ograniczenia UNIQUE i klucze złożone
Wymuszaj unikatowość jednej lub wielu kolumn, poznaj wpływ NULL na unikatowe indeksy i stosuj unikatowość złożoną dla kluczy naturalnych.
Ograniczenia UNIQUE i klucze złożone 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.
UNIQUE: duplikaty są niedozwolone
Ograniczenie UNIQUE nie pozwala, aby dwa wiersze miały tę samą wartość w ograniczanych kolumnach:
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
username VARCHAR(50) UNIQUE
);UNIQUE tworzy indeks
Ograniczenie UNIQUE jest implementowane za pomocą unikatowego indeksu B-tree, dlatego wyszukiwanie po tej kolumnie jest szybkie.
-- This shows the implicit index:
SELECT indexname FROM pg_indexes WHERE tablename = 'users';Złożone UNIQUE
Unikatowość kombinacji kolumn:
CREATE TABLE memberships (
user_id BIGINT NOT NULL,
group_id BIGINT NOT NULL,
role TEXT NOT NULL,
UNIQUE (user_id, group_id) -- a user can be in a group at most once
);UNIQUE a PRIMARY KEY
Klucz główny to w istocie UNIQUE + NOT NULL + wyznaczona tożsamość. Tabela może mieć JEDEN klucz główny, ale wiele ograniczeń UNIQUE.
NULL w UNIQUE
Standard SQL traktuje NULL jako różne od każdej innej wartości (w tym od innych wartości NULL). Kolumna UNIQUE może zawierać wiele wierszy z wartością NULL:
CREATE TABLE invites (email VARCHAR(255) UNIQUE);
INSERT INTO invites VALUES (NULL), (NULL); -- both succeed
-- PostgreSQL 15+ offers UNIQUE NULLS NOT DISTINCT to treat NULL as equal:
CREATE TABLE invites2 (email VARCHAR(255) UNIQUE NULLS NOT DISTINCT);Złożony klucz główny
Jeśli naturalny klucz złożony pasuje do danych, należy użyć go jako PRIMARY KEY:
CREATE TABLE order_items (
order_id BIGINT NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
product_id BIGINT NOT NULL REFERENCES products(id),
quantity INT NOT NULL CHECK (quantity > 0),
PRIMARY KEY (order_id, product_id)
);Klucz zastępczy + naturalny klucz UNIQUE
Popularny wzorzec: sztuczne id jako klucz główny oraz unikatowość w świecie rzeczywistym zapewniana przez UNIQUE:
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
sku VARCHAR(50) NOT NULL UNIQUE,
name TEXT NOT NULL
);Częściowe indeksy UNIQUE
Unikatowość tylko wśród wybranych wierszy:
-- One active email per user (deleted users can re-register):
CREATE UNIQUE INDEX users_active_email_idx
ON users (email)
WHERE deleted_at IS NULL;Indeksy UNIQUE na wyrażeniach
Unikatowość obliczanego wyrażenia — przydatna w przypadku adresów e-mail bez rozróżniania wielkości liter:
CREATE UNIQUE INDEX users_email_ci_idx ON users (LOWER(email));Błędy naruszenia UNIQUE
Zduplikowane wstawienie zwraca:
ERROR: duplicate key value violates unique constraint "users_email_key"
DETAIL: Key (email)=(alice@example.com) already exists.UPSERT bazuje na UNIQUE
ON CONFLICT wymaga wskazania UNIQUE lub PRIMARY KEY — dzięki temu PostgreSQL wie, co uznać za duplikat.
Podsumowanie
UNIQUE to drugie pod względem ważności ograniczenie po NOT NULL.
- Pojedyncze lub złożone
- Częściowe UNIQUE dla „tylko wśród aktywnych wierszy”
- UNIQUE na wyrażeniu dla kluczy bez rozróżniania wielkości liter
- Pamiętaj o zasadzie, że NULL jest różne od NULL
Szybki test
Czy kolumna UNIQUE może zawierać wiele wartości NULL w standardzie SQL?
Często zadawane pytania
Czy lekcja „Ograniczenia UNIQUE i klucze złożone” jest bezpłatna?
Tak — pełny tekst „Ograniczenia UNIQUE i klucze złożone” 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 „Ograniczenia UNIQUE i klucze złożone”?
Wymuszaj unikatowość jednej lub wielu kolumn, poznaj wpływ NULL na unikatowe indeksy i stosuj unikatowość złożoną dla kluczy naturalnych. Ć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 „Ograniczenia UNIQUE i klucze złożone”?
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
- Ograniczenia NOT NULL i CHECK
- Ograniczenia UNIQUE i klucze złożone
- FOREIGN KEY i akcje referencyjne
- Wartości DEFAULT i kolumny generowane