Aktualizacja bazy danych (INSERT, UPDATE, DELETE, transakcje)

Aktualizacja rekordów, usuwanie danych, kontrola transakcji — INF.03
✅ Po tej lekcji będziesz umiał:
  • dodawać nowe rekordy do tabeli poleceniem INSERT
  • aktualizować istniejące dane z warunkiem (UPDATE ... WHERE)
  • bezpiecznie usuwać rekordy (DELETE ... WHERE)
  • grupować operacje w transakcje i cofać zmiany (ROLLBACK)
  • konfigurować ON DELETE CASCADE dla integralności bazy

Teoria Aktualizowanie danych, transakcje i integralność

  • INSERT — dodaje rekord do tabeli.
  • UPDATE — zmienia dane istniejącego rekordu.
  • DELETE — usuwa rekordy spełniające warunek.
  • TRANSAKCJE (START/BEGIN, COMMIT, ROLLBACK) — gwarantują, że zestaw operacji wykona się w całości albo zostanie cofnięty.
  • Integralność danych — constraints (FOREIGN KEY, CHECK, UNIQUE) pilnują spójności podczas modyfikacji.

Transakcje pozwalają bezpiecznie modyfikować dane — w razie błędu można wycofać wszystkie operacje i przywrócić stan poprzedni.

Ćwiczenie 1 INSERT — dodawanie nowych rekordów

👁 Co chcemy osiągnąć?

Kliknij, żeby zobaczyć jak wyglądają dane po wykonaniu INSERT:

Zadanie: Dodaj nowego ucznia: imię „Ola", nazwisko „Dąbrowska", do klasy o id = 3. Następnie dodaj kilku uczniów jednym poleceniem.
  • Dodaj pojedynczego ucznia.
  • Dodaj trzech uczniów jednym INSERT.
INSERT INTO uczniowie (imie, nazwisko, klasa_id)
VALUES ('Ola', 'Dąbrowska', 3);

INSERT INTO uczniowie (imie, nazwisko, klasa_id) VALUES
('Jan', 'Nowak', 3),
('Kasia', 'Wiśniewska', 3),
('Marek', 'Lewandowski', 2);
🧪 Eksperyment — zmień kod i sprawdź efekt:
  • Pomiń kolumnę klasa_id — co się stanie jeśli ma NOT NULL?
  • Wpisz klasa_id = 999 (nieistniejący) — jak zareaguje klucz obcy?
  • Spróbuj wstawić duplikat jeśli imie ma constraint UNIQUE.

Ćwiczenie 2 UPDATE — edycja danych z warunkiem

👁 Co chcemy osiągnąć?
Zadanie: Zmień nazwisko ucznia o id = 7 na „Jankowski" oraz podnieś wszystkim uczniom z klasy „4TI" numer klasy na „4TIP".
  • Aktualizuj pojedynczy rekord po id.
  • Aktualizuj wiele rekordów z użyciem podzapytania.
UPDATE uczniowie
SET nazwisko = 'Jankowski'
WHERE id = 7;

UPDATE uczniowie
SET klasa_id = (
  SELECT id FROM klasy WHERE nazwa = '4TIP'
)
WHERE klasa_id = (
  SELECT id FROM klasy WHERE nazwa = '4TI'
);
🧪 Eksperyment:
  • Usuń klauzulę WHERE z UPDATE — co się stanie z wszystkimi rekordami?
  • Zaktualizuj nieistniejące id = 9999 — ile wierszy zostanie zmodyfikowanych?
🔴 Nie działa? Sprawdź:
  • czy w podzapytaniu nazwa klasy jest dokładnie taka sama jak w bazie (wielkie litery!)
  • czy tabela klasy w ogóle istnieje
  • czy masz uprawnienia do UPDATE na tej tabeli

Ćwiczenie 3 DELETE — usuwanie rekordów

👁 Co chcemy osiągnąć?

Uczniowie klasy „1A" bez ocen zostają usunięci. Uczniowie z ocenami pozostają.

Zadanie: Usuń wszystkich uczniów z klasy „1A", ale tylko jeśli nie mają żadnych ocen w tabeli oceny.
  • Użyj DELETE ... WHERE z podzapytaniem.
  • Upewnij się, że nie usuwasz uczniów posiadających oceny.
DELETE FROM uczniowie
WHERE klasa_id = (
  SELECT id FROM klasy WHERE nazwa = '1A'
)
AND id NOT IN (
  SELECT uczen_id FROM oceny
);
🧪 Eksperyment:
  • Spróbuj DELETE FROM uczniowie bez WHERE — ile rekordów usuniesz?
  • Przed DELETE wykonaj SELECT z tym samym WHERE — żeby zobaczyć co zostanie usunięte.
🔴 Nie działa? Sprawdź:
  • czy tabela oceny ma kolumnę uczen_id (nie id_ucznia itp.)
  • czy klasa „1A" istnieje — sprawdź SELECT * FROM klasy;
  • czy jest włączony foreign_key_checks (MySQL może blokować DELETE)

Ćwiczenie 4 Transakcje — bezpieczeństwo operacji

✅ Dlaczego to ważne?

Wyobraź sobie przelew bankowy: baza odejmuje pieniądze z konta A, ale przed dodaniem ich do konta B serwer pada. Bez transakcji pieniądze znikają. Z transakcją — ROLLBACK przywraca stan sprzed operacji.

Zadanie: Dodaj ocenę i zmień dane ucznia w jednej transakcji, tak aby w razie błędu można było cofnąć całość.
  • Rozpocznij transakcję (START TRANSACTION / BEGIN).
  • Wykonaj INSERT do oceny i UPDATE w uczniowie.
  • Zatwierdź zmiany (COMMIT) lub cofnij (ROLLBACK).
START TRANSACTION;

INSERT INTO oceny (uczen_id, przedmiot, ocena)
VALUES (10, 'matematyka', 5);

UPDATE uczniowie
SET nazwisko = 'Nowak'
WHERE id = 10;

-- Jeśli wszystko OK:
COMMIT;

-- Jeśli coś jest nie tak, zamiast COMMIT użyj:
-- ROLLBACK;
🧪 Eksperyment z ROLLBACK:
  • Otwórz dwie sesje w phpMyAdmin lub terminalu.
  • W sesji 1: START TRANSACTION; → INSERT → nie rób COMMIT.
  • W sesji 2: sprawdź SELECT * FROM oceny; — czy widzisz nowy rekord?
  • W sesji 1: ROLLBACK; — teraz sprawdź ponownie w sesji 2.
🔴 Nie działa? Sprawdź:
  • czy silnik tabeli to InnoDB (nie MyISAM — MyISAM nie obsługuje transakcji!)
  • sprawdź: SHOW CREATE TABLE uczniowie;
  • czy nie masz włączonego autocommit = 1 (każde polecenie zatwierdza się samo)

Ćwiczenie 5 ON DELETE CASCADE i integralność

👁 Co chcemy osiągnąć?

Po usunięciu ucznia o id=5 — jego oceny znikają automatycznie. Nie trzeba ręcznie czyścić tabeli oceny.

Zadanie: Skonfiguruj tabelę oceny tak, by po usunięciu ucznia automatycznie znikały jego oceny.
  • Dodaj klucz obcy z oceny.uczen_id do uczniowie.id.
  • Ustaw opcję ON DELETE CASCADE.
  • Przetestuj usuwanie ucznia.
-- Fragment definicji tabeli oceny:
CREATE TABLE oceny (
  id INT PRIMARY KEY AUTO_INCREMENT,
  uczen_id INT,
  przedmiot VARCHAR(30),
  ocena INT,
  FOREIGN KEY (uczen_id)
    REFERENCES uczniowie(id)
    ON DELETE CASCADE
);

-- Usuwanie ucznia:
DELETE FROM uczniowie WHERE id = 5;
-- Jego oceny zostaną usunięte automatycznie.
🧪 Eksperyment:
  • Zmień ON DELETE CASCADE na ON DELETE RESTRICT — co się stanie przy próbie usunięcia ucznia z ocenami?
  • Sprawdź ON DELETE SET NULL — kiedy warto go używać?

Ćwiczenie 6 Złożona transakcja — praktyka

Zadanie: Zmień nazwę projektu, dodaj nowe zadanie i w razie błędu cofnij wszystkie zmiany.
  • Rozpocznij transakcję.
  • Wykonaj UPDATE w tabeli projekty i INSERT w tabeli zadania.
  • Zatwierdź lub cofnij transakcję.
START TRANSACTION;

UPDATE projekty
SET nazwa = 'Sklep Online'
WHERE id = 2;

INSERT INTO zadania (opis, projekt_id, pracownik_id)
VALUES ('Projekt architektury', 2, 4);

-- Jeśli wszystko się udało:
COMMIT;

-- Jeśli był błąd:
-- ROLLBACK;

Zadanie INF.03 Operacje na danych „Biblioteka"

Opis: W bazie znajdują się tabele:
  • czytelnicy(id, imie, nazwisko, email)
  • ksiazki(id, tytul, autor, dostepna)
  • wypozyczenia(id, czytelnik_id, ksiazka_id, data_wypozyczenia, data_zwrotu)

Wykonaj operacje:

  1. Dodaj nowego czytelnika „Anna Kowalska" z adresem e‑mail.
  2. Dodaj wypożyczenie książki „Pan Tadeusz" przez Annę (ustaw data_zwrotu = NULL).
  3. Zmień status książki na „niedostępna" (np. dostepna = 0).
  4. W jednej transakcji przyjmij zwrot: ustaw datę zwrotu i oznacz książkę jako dostępną.
-- 1. Dodanie czytelnika
INSERT INTO czytelnicy (imie, nazwisko, email)
VALUES ('Anna', 'Kowalska', 'anna.kowalska@example.com');

-- Załóżmy, że czytelnik otrzymał id = 5
-- 2. Dodanie wypożyczenia „Pan Tadeusz"
INSERT INTO wypozyczenia (czytelnik_id, ksiazka_id, data_wypozyczenia, data_zwrotu)
VALUES (
  5,
  (SELECT id FROM ksiazki WHERE tytul = 'Pan Tadeusz'),
  CURRENT_DATE,
  NULL
);

-- 3. Zmiana statusu książki na niedostępną
UPDATE ksiazki
SET dostepna = 0
WHERE tytul = 'Pan Tadeusz';

-- 4. Transakcja zwrotu książki
START TRANSACTION;

UPDATE wypozyczenia
SET data_zwrotu = CURRENT_DATE
WHERE czytelnik_id = 5
  AND ksiazka_id = (SELECT id FROM ksiazki WHERE tytul = 'Pan Tadeusz')
  AND data_zwrotu IS NULL;

UPDATE ksiazki
SET dostepna = 1
WHERE tytul = 'Pan Tadeusz';

COMMIT;
-- W razie problemów użyj ROLLBACK zamiast COMMIT.
📝 Zadanie dodatkowe — spróbuj sam:
  1. Wyświetl wszystkie wypożyczenia, które nie mają daty zwrotu (data_zwrotu IS NULL).
  2. Dodaj drugiego czytelnika i wypożycz mu tę samą książkę — co się stanie gdy dostepna = 0?
  3. Napisz transakcję, która usuwa czytelnika i jego wypożyczenia naraz.

Quiz Sprawdź wiedzę!

  1. Jak dodać nowy rekord do tabeli?
    INSERT INTO tabela (kolumny) VALUES (wartości);
  2. Jak zaktualizować dane istniejącego rekordu z warunkiem?
    UPDATE tabela SET kolumna = wartość WHERE warunek;
  3. Jak usunąć tylko wybrane rekordy?
    DELETE FROM tabela WHERE warunek; — bez WHERE usuniesz wszystko!
  4. Na czym polega działanie transakcji w SQL?
    Transakcja grupuje kilka operacji w jeden „blok" — albo wszystkie się udają (COMMIT), albo wszystkie są cofane (ROLLBACK).
  5. Co zapewnia opcja ON DELETE CASCADE?
    Automatycznie usuwa rekordy powiązane w tabeli podrzędnej po usunięciu rekordu z tabeli nadrzędnej.
  6. Kiedy warto użyć ROLLBACK?
    Gdy w trakcie transakcji wykryto błąd i trzeba przywrócić stan sprzed rozpoczęcia zmian.
  7. Jaki silnik MySQL obsługuje transakcje?
    InnoDB — MyISAM nie obsługuje transakcji!

Checklista Sprawdź umiejętności

0 / 6 zaliczone
Materiały: INF.03 — Aktualizacja bazy SQL, transakcje · Autor: Tomasz Puchała © 2025