CodeGym /Kursy /SQL SELF /Dodawanie ograniczeń przy tworzeniu tabel: NOT NULL, UNIQ...

Dodawanie ograniczeń przy tworzeniu tabel: NOT NULL, UNIQUE

SQL SELF
Poziom 17 , Lekcja 1
Dostępny

Danych może być masa, ale nie wszystkie są przydatne. Żeby tabela nie zamieniła się w śmietnik, PostgreSQL pozwala ustawiać ograniczenia. To takie proste zasady, żeby nikt nie wpisał w pole "imię" cyfr albo nie zostawił go pustym.

Co to są constraints?

Ograniczenia (constraints) w PostgreSQL — to jak zasady zachowania w wojsku. Jak ich nie ma, każdy może robić co chce: wpisać wiek użytkownika jako -999, dodać pusty string zamiast imienia albo dwa razy zapisać tego samego studenta pod różnymi id. Żeby do tego nie doszło, PostgreSQL daje mechanizmy kontroli, które nazywają się ograniczeniami.

Ograniczenia pozwalają ci:

  1. Pozwolić twoim danym zostać poprawnymi i spójnymi.
  2. Upewnić się, że dane pasują do określonych zasad (np. wiek człowieka nie może być ujemny).
  3. Przyspieszyć znajdowanie błędów, jeśli dane nie są takie, jak się spodziewasz.

Dziś ogarniemy dwa najpopularniejsze ograniczenia: NOT NULL i UNIQUE.

Ograniczenie NOT NULL

Ograniczenie NOT NULL mówi PostgreSQL: "Hej, to pole zawsze musi mieć wartość. Niepewność tu nie przejdzie!". Jeśli spróbujesz dodać do tabeli wiersz z NULL, PostgreSQL rzuci błąd. To mega przydatne dla pól, które są obowiązkowe, np. imię albo data urodzenia studenta.

Przykład użycia NOT NULL

CREATE TABLE teachers (
    id SERIAL PRIMARY KEY,          -- Unikalny identyfikator
    name VARCHAR(100) NOT NULL,     -- Imię nauczyciela (obowiązkowe)
    subject VARCHAR(50) NOT NULL    -- Przedmiot, który prowadzi (obowiązkowe)
);

W tym przykładzie kolumny name i subject nie mogą być puste. Jeśli spróbujesz wstawić wiersz bez wartości dla tych kolumn, dostaniesz błąd.

INSERT INTO teachers (name, subject)
VALUES (NULL, 'Mathematics');

Wynik: błąd! Nie podałeś imienia nauczyciela, a name wymaga wartości.

Ograniczenie UNIQUE: wymagana unikalność

Ograniczenie UNIQUE gwarantuje, że wartości w kolumnie albo kombinacji kolumn nie będą się powtarzać. To przydatne, jeśli np. chcesz mieć pewność, że dwóch studentów nie ma tego samego numeru indeksu.

Jeśli NOT NULL to jak wymóg "wszyscy goście muszą być ubrani", to UNIQUE — "żadnych takich samych sukienek na imprezie".

Przykład użycia UNIQUE

CREATE TABLE departments (
    id SERIAL PRIMARY KEY,      -- Unikalny identyfikator
    name VARCHAR(100) UNIQUE    -- Nazwa departamentu musi być unikalna
);

Teraz nie dodasz dwóch departamentów z tą samą nazwą.

INSERT INTO departments (name) VALUES ('Mathematics');
INSERT INTO departments (name) VALUES ('Mathematics');

Wynik: błąd! Próba wstawienia wiersza z powtarzającą się wartością w kolumnie name.

Kombinowane ograniczenie UNIQUE

Możesz też ustawić unikalność dla kombinacji dwóch (albo więcej) kolumn. Na przykład:

CREATE TABLE enrollments (
    id SERIAL PRIMARY KEY,          -- Unikalny identyfikator dla wpisu
    student_id INTEGER NOT NULL,    -- Identyfikator studenta
    course_id INTEGER NOT NULL,     -- Identyfikator kursu
    UNIQUE (student_id, course_id)  -- Jeden student nie może zapisać się na ten sam kurs dwa razy
);

Teraz każda para student_id i course_id musi być unikalna. Jeśli ktoś spróbuje dwa razy zapisać tego samego studenta na ten sam kurs, PostgreSQL na to nie pozwoli.

Kombinowanie ograniczeń: NOT NULL i UNIQUE

Możesz połączyć NOT NULL i UNIQUE dla jednej kolumny. Na przykład:

CREATE TABLE users (
    username VARCHAR(50) NOT NULL UNIQUE, -- Unikalny login, obowiązkowy do wypełnienia
    email VARCHAR(100) NOT NULL UNIQUE -- Unikalny adres e-mail, obowiązkowy do wypełnienia
);

Tutaj login i adres e-mail muszą być unikalne i nie mogą być puste.

Typowe błędy przy używaniu ograniczeń

Jeśli ustawisz UNIQUE na kolumnie, ale nie dodasz ograniczenia NOT NULL, możesz wprowadzić kilka wierszy z pustymi wartościami NULL, bo PostgreSQL uważa, że NULL nie równa się innemu NULL. Jeśli chcesz zabronić pustych wartości, dodaj NOT NULL.

Próba dodania powtarzającej się wartości do kolumny z ograniczeniem UNIQUE wywoła błąd. Zawsze sprawdzaj dane wejściowe przed INSERT.

Za dużo ograniczeń może spowolnić operacje wstawiania.

Po co to wszystko?

Używanie ograniczeń pozwala uniknąć wielu problemów, jak duplikaty danych, puste wiersze i inne błędy, które mogą się pojawić przez czynnik ludzki. Dzięki nim twoja baza danych jest "samo-pilnująca się", a przy dużych projektach to oszczędza masę czasu. Na rozmowach o pracę często pytają o ograniczenia, więc znajomość NOT NULL i UNIQUE to nie tylko przydatna umiejętność, ale też szansa, żeby zaimponować przyszłym pracodawcom.

Na następnej lekcji ogarniemy ograniczenie DEFAULT, które pozwala ustawić domyślne wartości dla kolumn, jeśli użytkownik nic nie podał. Do zobaczenia!

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION