Czasem nie chce nam się wypełniać wszystkich pól ręcznie — no, po prostu nie mamy na to ochoty albo nie mamy danych. W takich sytuacjach można wcześniej ustawić domyślne wartości, żeby baza sama je podstawiła, kiedy trzeba.
Wstawianie wierszy do tabeli
Domyślne wartości są mocno powiązane z wstawianiem wierszy do tabeli. Dlatego teraz krótko o tym opowiem, a za kilka lekcji wrócimy do tego tematu i poświęcimy mu tyle uwagi, ile trzeba.
Dodawanie wierszy do tabeli jest bardzo proste - służy do tego specjalna komenda INSERT INTO. INSERT INTO — to operator SQL, który dodaje nowe wiersze do tabeli. To jeden z najczęściej używanych operatorów, szczególnie przy pracy z web-formularzami, logami, rejestracją użytkowników i aktualizacją danych.
Składnia komendy
INSERT INTO tabela (kolumna1, kolumna2, ...)
VALUES (wartość1, wartość2, ...);
Wyjaśnienie:
tabela— nazwa tabeli, do której dodajesz dane.kolumna1,kolumna2, ... — lista kolumn (możesz pominąć, jeśli wartości idą do wszystkich kolumn w odpowiedniej kolejności).wartość1,wartość2, ... — wartości odpowiadające wymienionym kolumnom.
Prosty przykład
INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com');
Dodaje do tabeli users jeden wiersz: imię — "Alice", email — "alice@example.com".
Rezultat:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
Wstawianie kilku wierszy naraz
Możesz też wstawić kilka rekordów jednym zapytaniem — szybciej i wydajniej.
INSERT INTO users (name, email)
VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.net'),
('Charlie', 'charlie@example.org'),
('Diana', 'diana@example.com'),
('Eve', 'eve@example.net');
I taki będzie rezultat:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
| 3 | Charlie | charlie@example.org |
| 4 | Diana | diana@example.com |
| 5 | Eve | eve@example.net |
Wartość domyślna
Pamiętasz składnię komendy do dodawania wierszy?
INSERT INTO tabela (kolumna1, kolumna2, ...)
VALUES (wartość1, wartość2, ...);
Jak myślisz, po co tam jest lista kolumn: kolumna1, kolumna2? Przecież można po prostu podać wartości w tej samej kolejności, co kolumny w tabeli.
Chodzi o to, że bardzo wiele wartości możesz nie podawać przy dodawaniu danych. Na przykład ID nowego wiersza PostgreSQL wyliczy sam przy dodawaniu. Tak samo może sam wyliczyć aktualną datę/czas dodania wiersza i wpisać ją do odpowiedniej kolumny. Jeśli jakieś dane nie zostały przekazane, PostgreSQL zamieni je na NULL.
PostgreSQL może zrobić za ciebie sporo fajnych rzeczy. I możesz tym sterować — właśnie po to są wartości domyślne, ustawiane przez słowo kluczowe DEFAULT.
Wartość domyślna jest używana wtedy, gdy przy dodawaniu rekordu dla konkretnej kolumny nie podasz wartości. To nie tylko oszczędza czas, ale też zapobiega przypadkowym błędom, jak pominięcie ważnej wartości.
Jak działa DEFAULT?
Sprawdźmy składnię. Wartości domyślne ustawia się na etapie tworzenia tabeli. Ogólny format wygląda tak:
CREATE TABLE tabela (
kolumna typ_danych DEFAULT wartość_domyślna
);
Albo, jeśli chcesz dodać wartość domyślną do już istniejącej tabeli:
ALTER TABLE tabela
ALTER COLUMN kolumna
SET DEFAULT wartość_domyślna;
Więcej o zmianie tabel opowiem dosłownie za parę wykładów :P
Przykład 1: Tabela z polem DEFAULT
Stwórzmy tabelę students, w której każdy student automatycznie dostaje datę rejestracji:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
registration_date DATE DEFAULT CURRENT_DATE
);
Teraz, gdy dodajesz nowego studenta bez podania registration_date, PostgreSQL automatycznie wypełni to pole bieżącą datą.
INSERT INTO students (name) VALUES ('Alex Lin');
Przy zapytaniu:
SELECT * FROM students;
Dostaniesz taki wynik:
| id | name | registration_date |
|---|---|---|
| 1 | Alex Lin | 2023-10-15 |
Praktyczne przykłady
Wartość domyślna dla kolumny liczbowej
Załóżmy, że mamy tabelę grades, gdzie w kolumnie grade powinna być domyślna wartość 0, jeśli ocena jeszcze nie została wystawiona.
CREATE TABLE grades (
id SERIAL PRIMARY KEY,
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
grade INTEGER DEFAULT 0
);
Dodajemy rekord bez podania grade:
INSERT INTO grades (student_id, course_id) VALUES (1, 101);
Teraz tabela wygląda tak:
| id | student_id | course_id | grade |
|---|---|---|---|
| 1 | 1 | 101 | 0 |
Użycie TEXT z wartością domyślną
Wyobraź sobie tabelę teachers, gdzie każdemu nauczycielowi automatycznie przypisywany jest status „niezweryfikowany” przy dodaniu.
CREATE TABLE teachers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
status TEXT DEFAULT 'unverified'
);
Dodajemy nauczyciela bez podania statusu:
INSERT INTO teachers (name) VALUES ('Peter Pall');
Rezultat będzie taki:
| id | name | status |
|---|---|---|
| 1 | Peter Pall | unverified |
Domyślne wartości dla czasu
Dla tabeli meetings, w której trzymamy dane o spotkaniach, można ustawić pole meeting_time, które wskazuje standardową godzinę rozpoczęcia: 10:00 rano.
CREATE TABLE meetings (
id SERIAL PRIMARY KEY,
topic VARCHAR(100),
meeting_time TIME DEFAULT '10:00'
);
Dodajemy rekord:
INSERT INTO meetings (topic) VALUES ('Omówienie projektu');
Rezultat:
| id | topic | meeting_time |
|---|---|---|
| 1 | Omówienie projektu | 10:00 |
Typowe błędy przy użyciu DEFAULT
Niezgodność typu danych z wartością domyślną. Jeśli próbujesz ustawić tekstową wartość dla kolumny liczbowej, PostgreSQL się obrazi:
CREATE TABLE example (
number INTEGER DEFAULT 'tekst'
);
Błąd:
invalid input syntax for type integer.
Zmiana DEFAULT bez uwzględnienia istniejących rekordów. Gdy zmieniasz wartość domyślną, nie wpływa to na już dodane rekordy — one zostają po staremu. Jeśli chcesz zaktualizować istniejące wiersze, użyj UPDATE.
UPDATE students SET registration_date = '2023-01-01' WHERE registration_date IS NULL;
Mieszanie DEFAULT i NOT NULL. Wartość domyślna nie oznacza, że pole automatycznie staje się obowiązkowe (NOT NULL). Bez jawnego NOT NULL kolumna może przyjmować wartość NULL.
GO TO FULL VERSION