🎯 Cele lekcji

1. Podstawowa składnia INSERT INTO

-- Forma PEŁNA (zalecana) — wymieniamy kolumny
INSERT INTO klienci (imie, nazwisko, email, telefon)
VALUES ('Jan', 'Kowalski', 'jan@mail.com', '500111222');

-- Forma SKRÓCONA — wszystkie kolumny po kolei (niebezpieczna!)
INSERT INTO klienci
VALUES (NULL, 'Jan', 'Kowalski', 'jan@mail.com', '500111222');
-- NULL = AUTO_INCREMENT, kolejność musi być dokładnie jak w tabeli!
Zawsze używaj pełnej formy z nazwami kolumn — jest bezpieczniejsza. Jeśli zmieni się struktura tabeli (nowe kolumny), pełna forma nadal działa poprawnie.

Wartości specjalne:

WartośćOpisPrzykład
NULLBrak wartości (kolumna musi dopuszczać NULL)VALUES (NULL, 'tekst')
DEFAULTUżyj wartości domyślnej zdefiniowanej w tabeliVALUES (DEFAULT, 'tekst')
NOW()Aktualna data i czasVALUES ('Jan', NOW())
CURDATE()Aktualna dataVALUES ('Jan', CURDATE())
UUID()Unikalny identyfikator UUIDVALUES (UUID(), 'tekst')
📋

2. Wstawianie wielu wierszy i INSERT...SELECT

-- Wstawianie wielu wierszy naraz (znacznie wydajniejsze!)
INSERT INTO kategorie (nazwa) VALUES
  ('Elektronika'),
  ('Odzież'),
  ('Książki'),
  ('Sport'),
  ('Dom i ogród');

-- INSERT ... SELECT — wstaw wyniki zapytania
INSERT INTO archiwum_klientow (imie, nazwisko, email)
SELECT imie, nazwisko, email
FROM klienci
WHERE aktywny = 0;  -- skopiuj nieaktywnych do archiwum

-- Kopiowanie całej tabeli
INSERT INTO produkty_kopia
SELECT * FROM produkty;
Wstawianie wielu wierszy jednym INSERT jest znacznie szybsze niż wiele osobnych INSERT-ów — SZBD wykonuje tylko jedną operację zapisu na dysk i jedną transakcję.
🛡️

3. INSERT IGNORE i ON DUPLICATE KEY UPDATE

-- INSERT IGNORE: pomiń błędy (duplikat unikalnego klucza)
INSERT IGNORE INTO kategorie (nazwa)
VALUES ('Elektronika');
-- Jeśli 'Elektronika' już istnieje → brak błędu, pomiń

-- ON DUPLICATE KEY UPDATE: upsert (update jeśli istnieje)
INSERT INTO stany_magazynowe (id_produktu, ilosc)
VALUES (10, 50)
ON DUPLICATE KEY UPDATE
  ilosc = ilosc + VALUES(ilosc);
-- Jeśli id_produktu=10 istnieje → dodaj 50 do aktualnej ilości
-- Jeśli nie istnieje → wstaw nowy rekord

-- REPLACE INTO: usuń stary, wstaw nowy (rzadziej używane)
REPLACE INTO kategorie (id_kategorii, nazwa)
VALUES (1, 'Elektronika i Multimedia');
INSERT IGNORE vs ON DUPLICATE KEY UPDATE:
INSERT IGNORE — po prostu pomiń kolizję (stara wartość zostaje)
ON DUPLICATE KEY UPDATE — zaktualizuj istniejący rekord nową wartością
REPLACE INTO — usuń stary i wstaw nowy (resetuje AUTO_INCREMENT!)
⚠️

4. Typowe błędy przy INSERT

Kod błęduOpisPrzykładRozwiązanie
ERROR 1048 Column cannot be null — naruszenie NOT NULL INSERT INTO klienci (email) VALUES (NULL) gdy email NOT NULL Podaj wartość dla kolumny NOT NULL
ERROR 1062 Duplicate entry — duplikat wartości UNIQUE / PK INSERT INTO klienci (email) VALUES ('jan@mail.com') — email już istnieje Użyj INSERT IGNORE lub ON DUPLICATE KEY UPDATE
ERROR 1452 Cannot add child row — naruszenie FK Wstaw produkt z id_kategorii=999 gdy kategoria 999 nie istnieje Najpierw wstaw rekord rodzica (kategorię), potem dziecko (produkt)
ERROR 1406 Data too long — wartość za długa dla kolumny VARCHAR(10) z wartością dłuższą niż 10 znaków Rozszerz typ lub skróć wartość
ERROR 1366 Incorrect integer value — błędny typ Wstaw tekst 'abc' do kolumny INT Dopasuj typ wartości do typu kolumny
-- Przykład poprawnego INSERT z różnymi typami
INSERT INTO produkty (nazwa, cena, ilosc_mag, id_kategorii, aktywny, dodano)
VALUES
  ('Laptop Dell XPS 15', 4999.99, 5,    1, TRUE,  NOW()),
  ('Mysz Logitech MX3',  299.00,  20,   1, TRUE,  NOW()),
  ('T-Shirt bawełna',     59.90,   100,  2, TRUE,  NOW()),
  ('Książka SQL w 24h',   49.00,   30,   3, FALSE, '2024-01-15');
✏️

Zadania interaktywne

Zadanie 1Napisz INSERT dla tabeli klienci

Tabela klienci ma kolumny: id_klienta INT AUTO_INCREMENT PK, imie VARCHAR(50) NOT NULL, nazwisko VARCHAR(100) NOT NULL, email VARCHAR(200) UNIQUE, miasto VARCHAR(100) DEFAULT 'Warszawa'.

Napisz INSERT wstawiający klienta: Anna Nowak, anna@example.com, Kraków:

Zadanie 2Quiz: INSERT IGNORE i duplikaty

Tabela kategorie ma unikalny indeks na kolumnie nazwa. Rekord 'Elektronika' już istnieje. Co się stanie po wykonaniu:

INSERT IGNORE INTO kategorie (nazwa) VALUES ('Elektronika');
  • Serwer zwróci błąd ERROR 1062 (Duplicate entry)
  • Wstawi drugi rekord 'Elektronika' (duplikat zostanie pominięty w indeksie)
  • Operacja zostanie po cichu pominięta — żaden błąd, żaden nowy rekord
  • Zaktualizuje istniejący rekord nową wartością
Zadanie 3Popraw błędny INSERT

Poniższy INSERT zawiera błędy. Wskaż wszystkie problemy:

INSERT INTO produkty
VALUES ('Laptop', 'cztery tysiące', 5, 1);

Tabela produkty: id INT AUTO_INCREMENT PK, nazwa VARCHAR(200) NOT NULL, cena DECIMAL(10,2) NOT NULL, ilosc INT, id_kategorii INT

📌 Zapamiętaj