CodeGym /Kursy /SQL SELF /Wstawianie danych do tabel z ograniczeniami: NOT N...

Wstawianie danych do tabel z ograniczeniami: NOT NULL, DEFAULT

SQL SELF
Poziom 21, Lekcja 1
Dostępny

Dzisiaj szczegółowo ogarniemy kolejny ważny temat pracy z bazami danych — jak wstawiać dane do tabel, które mają ograniczenia NOT NULL i DEFAULT. Na tym etapie już znasz podstawową składnię komendy INSERT INTO i wiesz, jak dodawać wiersze do tabel o określonej strukturze. Teraz czas wejść głębiej w szczegóły — bo praca z ograniczeniami często bywa źródłem bólu głowy dla programistów. Ale spokojnie, po tym wykładzie będziesz ogarniać te mechanizmy bez stresu!

Co to są ograniczenia?

Ograniczenia to zasady, które nakładamy na kolumny tabeli. Pomagają one utrzymać dane w logicznie poprawnej formie. Na przykład, nie da się zostawić pustego pola, które musi mieć wartość (NOT NULL), albo można nie podawać wartości dla kolumny, jeśli z góry ustawiono wartość domyślną (DEFAULT).

Rodzaje ograniczeń: - NOT NULL — oznacza, że kolumna nie może mieć NULL. - DEFAULT — ustawia wartość, która automatycznie zostanie wpisana do kolumny, jeśli jej nie podasz.

Ograniczenia pomagają dbać o integralność danych. Wyobraź sobie, że trzymasz listę studentów w tabeli students i jedno z zasad — każdy student musi mieć imię (NOT NULL). Bez tego ograniczenia ktoś zapomni wpisać imię i w bazie pojawi się "student bez imienia". Albo inny przykład: ustalasz, że domyślna liczba punktów ECTS dla nowego kursu to 0 (DEFAULT), żeby nie musieć o tym pamiętać za każdym razem.

Praca z ograniczeniem NOT NULL

Ograniczenie NOT NULL wymusza podanie wartości w konkretnej kolumnie przy dodawaniu rekordu. Jeśli spróbujesz wstawić do tej kolumny NULL albo w ogóle jej nie podasz, baza danych się "obrazi" (wyskoczy błąd). Zobaczmy przykład.

Stwórzmy prostą tabelę students:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,     -- Imię nie może być puste
    age INT
);

Zwróć uwagę: kolumna name ma ograniczenie NOT NULL, a kolumna age już nie.

Przykład wstawiania danych z NOT NULL

Teraz spróbujmy dodać studentów:

-- Przykład udanego wstawienia
INSERT INTO students (name, age) VALUES ('Alice', 23);
-- Sukces: imię podane, pole spełnia ograniczenie NOT NULL

-- Przykład błędu:
INSERT INTO students (age) VALUES (30);
-- Błąd: pole name nie może być NULL, bo ma ograniczenie NOT NULL

Kiedy zobaczysz błąd typu null value in column "name" violates not-null constraint, nie panikuj — to tylko PostgreSQL przypomina, żeby być uważnym.

Używanie wartości domyślnych (DEFAULT)

Ograniczenie DEFAULT mówi bazie: "Jak ktoś zapomni podać wartość dla tej kolumny, użyj tej domyślnej". To mega ułatwia życie, bo nie trzeba wypełniać każdej linijki ręcznie.

Przykład tabeli z ograniczeniem DEFAULT

Stwórzmy tabelę courses:

CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    credits INT DEFAULT 0   -- Wartość domyślna dla kolumny credits to 0
);

Przykład wstawiania danych z DEFAULT

Teraz spróbujmy dodać kursy:

-- Jawnie podaliśmy wartość dla credits
INSERT INTO courses (name, credits) VALUES ('Mathematics', 5);

-- Nie podaliśmy wartości dla credits — zostanie użyta wartość domyślna (0)
INSERT INTO courses (name) VALUES ('History');

-- Zobaczmy, co wyszło
SELECT * FROM courses;

Wynik:

id name credits
1 Mathematics 5
2 History 0

Zwróć uwagę: przy dodawaniu kursu History nie podaliśmy liczby punktów. PostgreSQL automatycznie wpisał do kolumny credits wartość 0.

Wspólne użycie ograniczeń NOT NULL i DEFAULT

Takie kolumny wymagają wartości, nawet jeśli sam ich nie podasz. Na przykład w tabeli courses kolumna credits może mieć i DEFAULT, i NOT NULL, żeby nikt przypadkiem nie zostawił jej pustej NULL.

CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    credits INT NOT NULL DEFAULT 0
);

Przykład wstawiania danych

Załóżmy, że każdy nowy kurs ma domyślnie 0 punktów, ale NULL nie jest dozwolony.

-- Sukces: credits przyjmuje wartość domyślną
INSERT INTO courses (name) VALUES ('Physics');

-- Błąd: próba jawnego wstawienia NULL do kolumny z NOT NULL
INSERT INTO courses (name, credits) VALUES ('Chemistry', NULL);

Przykład: Dodawanie studenta z obowiązkowym imieniem

Stwórzmy tabelę students z ograniczeniami:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,                         -- Imię obowiązkowe
    enrollment_date DATE DEFAULT CURRENT_DATE   -- Data zapisu domyślnie — dzisiejsza
);

Teraz dodajmy do niej studentów:

-- Imię podane, data zapisu zostanie ustawiona automatycznie
INSERT INTO students (name) VALUES ('Bob');

-- Spróbujmy nie podać imienia (dostaniemy błąd)
INSERT INTO students (enrollment_date) VALUES ('2024-10-01');

To świetny przykład, jak PostgreSQL pomaga pilnować poprawności danych: każdy student musi mieć imię, a data zapisu nie wymaga podania.

Tipy i "pułapki"

Gdy pracujesz z ograniczeniami NOT NULL i DEFAULT, warto pamiętać o kilku rzeczach. Na przykład, jeśli w danych często pojawia się NULL, ograniczenie NOT NULL może być prawdziwą zmorą. A jeśli ustawisz wartość domyślną dla każdej kolumny, możesz przypadkiem dostać niepoprawne dane (np. 0 zamiast prawdziwej wartości).

Zazwyczaj jeśli dodajesz nową kolumnę do istniejącej tabeli, to jej komórki dla już istniejących wierszy są wypełnione NULL. Jednak jeśli ustawisz DEFAULT X, cała kolumna zostanie wypełniona wartością X. To bardzo wygodne i pomaga dbać o spójność bazy.

Na przykład nowa kolumna to FOREING KEY do istniejącej tabeli. I nie może mieć NULL ani 0. Musi wskazywać na istniejące wiersze istniejącej tabeli.

Co zrobić, jeśli zapomniałeś dodać ograniczenia?

Spoko — ograniczenia zawsze możesz dodać później za pomocą komendy ALTER TABLE. Na przykład:

-- Dodajemy ograniczenie DEFAULT do istniejącej kolumny
ALTER TABLE courses ALTER COLUMN credits SET DEFAULT 0;

-- Dodajemy ograniczenie NOT NULL do istniejącej kolumny
ALTER TABLE students ALTER COLUMN name SET NOT NULL;

Te zapytania nie popsują już istniejących danych — możesz ich używać na tabelach, w których już coś wartościowego jest.

Teraz jesteś gotowy używać mocy PostgreSQL do zarządzania ograniczeniami! Twoje dane będą bardziej uporządkowane i zabezpieczone przed błędami, a zapytania — logiczne i przewidywalne.

2
Zadanie
SQL SELF, poziom 21, lekcja 1
Niedostępne
Wspólne użycie `NOT NULL` i `DEFAULT`
Wspólne użycie `NOT NULL` i `DEFAULT`
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION