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:
- Pozwolić twoim danym zostać poprawnymi i spójnymi.
- Upewnić się, że dane pasują do określonych zasad (np. wiek człowieka nie może być ujemny).
- 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!
GO TO FULL VERSION