INSERT
UPDATE
DELETE
UPDATE
DELETE
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 CASCADEdla 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 maNOT NULL? - Wpisz
klasa_id = 999(nieistniejący) — jak zareaguje klucz obcy? - Spróbuj wstawić duplikat jeśli
imiema constraintUNIQUE.
Ć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ę
WHEREz 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
klasyw 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 ... WHEREz 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 uczniowiebez WHERE — ile rekordów usuniesz? - Przed DELETE wykonaj
SELECTz tym samym WHERE — żeby zobaczyć co zostanie usunięte.
🔴 Nie działa? Sprawdź:
- czy tabela
ocenyma kolumnęuczen_id(nieid_uczniaitp.) - 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
ocenyi UPDATE wuczniowie. - 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_iddouczniowie.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 CASCADEnaON 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
projektyi INSERT w tabelizadania. - 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:
- Dodaj nowego czytelnika „Anna Kowalska" z adresem e‑mail.
- Dodaj wypożyczenie książki „Pan Tadeusz" przez Annę (ustaw
data_zwrotu = NULL). - Zmień status książki na „niedostępna" (np.
dostepna = 0). - 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:
- Wyświetl wszystkie wypożyczenia, które nie mają daty zwrotu (
data_zwrotu IS NULL). - Dodaj drugiego czytelnika i wypożycz mu tę samą książkę — co się stanie gdy
dostepna = 0? - Napisz transakcję, która usuwa czytelnika i jego wypożyczenia naraz.
Quiz Sprawdź wiedzę!
-
Jak dodać nowy rekord do tabeli?
INSERT INTO tabela (kolumny) VALUES (wartości); -
Jak zaktualizować dane istniejącego rekordu z warunkiem?
UPDATE tabela SET kolumna = wartość WHERE warunek; -
Jak usunąć tylko wybrane rekordy?
DELETE FROM tabela WHERE warunek;— bez WHERE usuniesz wszystko! -
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).
-
Co zapewnia opcja
ON DELETE CASCADE?Automatycznie usuwa rekordy powiązane w tabeli podrzędnej po usunięciu rekordu z tabeli nadrzędnej. -
Kiedy warto użyć ROLLBACK?
Gdy w trakcie transakcji wykryto błąd i trzeba przywrócić stan sprzed rozpoczęcia zmian.
-
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