INSERT: dodawanie danych
Zapisz nowy wiersz, opanuj apostrofy i NULL, a potem sprawdź to, co naprawdę znalazło się w tabeli.
Część bazodanowa INF.03Struktura jest gotowa. Dodaj wiersz.
INSERT należy do DML i zapisuje nowe dane. Lista po nazwie tabeli wskazuje kolumny, a VALUES podaje wartości w tej samej kolejności. Jawna lista kolumn ułatwia czytanie i chroni przed pomyłkami po zmianie schematu.
INSERT INTO klienci (id, imie, miasto, email)
VALUES (6, 'Ola', 'Lublin', NULL);
SELECT id, imie, miasto, email
FROM klienci WHERE id = 6;Po resecie edytora istnieje pięciu klientów. Polecenie dodaje szóstego. NULL nie ma apostrofów. Tekst jest zapisany między pojedynczymi apostrofami, a liczba 6 nie wymaga cudzysłowów. Drugie polecenie odczytuje zapisany wiersz — sam komunikat „wykonano” nie zastępuje kontroli danych.
Kolumny, liczba wartości i kolejność
Dobry zapis
INSERT INTO klienci (imie, id)
VALUES ('Ola', 6);Kolejność wartości odpowiada kolejności wymienionych kolumn. Pominięte opcjonalne miasto i email dostaną tutaj NULL.
Pułapka
INSERT INTO klienci
VALUES (6, 'Ola');Bez listy kolumn zwykle trzeba podać wartości dla całej przewidywanej struktury. W tej tabeli są cztery kolumny, nie dwie.
Brak wymaganej wartości bez domyślnej może zakończyć się błędem. DEFAULT działa przy pominięciu kolumny lub użyciu składni właściwej dla silnika. Jawne NULL nie jest automatycznym żądaniem wartości domyślnej. Nie polegaj na cichej konwersji błędnego tekstu do liczby.
Apostrof wewnątrz tekstu
INSERT INTO klienci (id, imie, miasto, email)
VALUES (7, 'O''Neil', 'Dublin', '[email protected]');Dwa apostrofy w literałach SQL oznaczają jeden apostrof danych. To zapis przykładu ręcznego, nie instrukcja budowania zapytań PHP przez sklejanie tekstu użytkownika. W aplikacji stosuj parametry przygotowanych zapytań — wrócimy do tego w części o PHP.
Ten sam INSERT w różnych środowiskach
Pojedyncze INSERT INTO ... (kolumny) VALUES (...) jest wspólnym punktem wyjścia dla MySQL/MariaDB, SQL Server, Oracle 19c i Access/ACE. Kolumny muszą jednak istnieć i mieć zgodne typy. W SQL Server przy literałach Unicode stosuj np. N'Łódź'. W Oracle data kalendarzowa może być literałem DATE '2026-02-03', a Access używa literałów dat ograniczonych znakiem #. Nie kopiuj formatowania dat między silnikami.
-- MySQL / MariaDB i SQL Server
INSERT INTO klienci (id, imie, miasto, email) VALUES
(8, 'Iga', 'Opole', '[email protected]'),
(9, 'Piotr', 'Poznan', '[email protected]');
-- Przenośny sposób także dla Oracle 19c i Access:
-- dwa osobne polecenia; w Access uruchamiaj je osobno
INSERT INTO klienci (id, imie, miasto, email)
VALUES (8, 'Iga', 'Opole', '[email protected]');
INSERT INTO klienci (id, imie, miasto, email)
VALUES (9, 'Piotr', 'Poznan', '[email protected]');Nie wykonuj obu wersji na tych samych danych — powtórzą klucze 8 i 9. Oracle 19c ma również INSERT ALL; nie przyjmuje składni wielu krotek VALUES tak jak MySQL. Numery generowane automatycznie zwykle pomijamy w liście kolumn; nie wpisujemy zgadywanego następnego id.
Wypróbuj zapytanie
SQLite w przeglądarce — ograniczona emulacja składni MySQL / SQL Server. To nie są rzeczywiste serwery. Ścisłe typy, auto-ID i administrację ćwicz w prawdziwym SZBD.
Dodawanie wyniku SELECT
INSERT może pobierać dane z zapytania zamiast z ręcznej listy. Liczba i typy wybranych kolumn muszą pasować do kolumn celu. Poniższy przykład działa w uproszczonym schemacie edytora:
CREATE TABLE wybrani (id INTEGER PRIMARY KEY, imie TEXT);
INSERT INTO wybrani (id, imie)
SELECT id, imie FROM klienci WHERE id <= 2;
SELECT * FROM wybrani ORDER BY id;Powstaną dwa wiersze: Ala i Jan. To kopia wartości w chwili wykonania, nie automatycznie aktualizowany widok. Późniejsza zmiana klienta nie przepisze sama tabeli wybrani.
Gdy zapis się nie powiedzie
- Duplikat PRIMARY KEY/UNIQUE: sprawdź, czy polecenie nie zostało już wykonane. Nie kasuj ograniczenia tylko dla pominięcia błędu.
- NOT NULL: uzupełnij brakującą wartość lub popraw projekt, jeśli pole naprawdę jest opcjonalne.
- FOREIGN KEY: najpierw musi istnieć wskazany rodzic, np. klient zamówienia.
- CHECK lub błędny typ: popraw dane i zrozum wymagany zakres.
Edytor cofa cały błędny pakiet. Rzeczywisty serwer może zachować wcześniejsze poprawne polecenia, zależnie od transakcji i trybu pracy. Zawsze kontroluj stan przed ponownym wysłaniem.
Ćwiczenia
- Dodaj produkt o id 5, nazwie „Podkladka” i cenie 30. Wyświetl go.
- Dodaj klienta o id 10 i imieniu zawierającym apostrof. Użyj nowego adresu z domeną example.invalid.
- Wyjaśnij różnicę między pominięciem kolumny z DEFAULT a wpisaniem NULL.
Rozwiązania
INSERT INTO produkty (id, nazwa, cena)
VALUES (5, 'Podkladka', 30);
SELECT * FROM produkty WHERE id = 5;
INSERT INTO klienci (id, imie, email)
VALUES (10, 'D''Angelo', '[email protected]');Wynik pierwszego SELECT to jeden produkt. Imię drugiego klienta zawiera jeden apostrof. Pominięcie może uruchomić DEFAULT; jawne NULL zwykle zapisuje brak wartości albo narusza NOT NULL. Po próbach możesz przywrócić dane przyciskiem Reset bazy.
Źródła: MySQL INSERT, Oracle 19c INSERT, Access INSERT INTO. INF.03.4: wprowadzanie danych, DML i spójność. Dalej: SELECT, aliasy i DISTINCT.

