0Pricing
SQL Academy · Lekcja

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

  1. Ograniczenia NOT NULL i CHECK
  2. Ograniczenia UNIQUE i klucze złożone
  3. FOREIGN KEY i akcje referencyjne
  4. Wartości DEFAULT i kolumny generowane
← Powrót do SQL Academy