INF.03 · Moduł 20 · Klasa 4 TI

INSERT · UPDATE · DELETE

Aktualizacja bazy danych i transakcje SQL — na przykładzie bazy GameVault

INSERT UPDATE DELETE TRANSACTION COMMIT ROLLBACK ON DELETE CASCADE
📘

Teoria — kluczowe polecenia

INSERT INTO

Dodaje nowy rekord do tabeli. Wskazujesz kolumny i wartości — muszą pasować typem. Można wstawić wiele wierszy jednym poleceniem przez podanie wielu krotek VALUES.

UPDATE ... SET ... WHERE

Zmienia wartości w istniejących rekordach. ZAWSZE używaj WHERE — bez niego zmodyfikujesz WSZYSTKIE wiersze w tabeli!

DELETE FROM ... WHERE

Usuwa rekordy spełniające warunek. Bez WHERE usuniesz całą zawartość tabeli. Operacja jest nieodwracalna bez transakcji.

Transakcje: START · COMMIT · ROLLBACK

Grupują kilka operacji w jeden blok. COMMIT zatwierdza i utrwala zmiany. ROLLBACK cofa wszystkie operacje do punktu startu.

ON DELETE CASCADE

Opcja klucza obcego — po usunięciu rekordu nadrzędnego, powiązane rekordy podrzędne znikają automatycznie. Używaj świadomie!

Porównanie poleceń DML

INSERT
Dodaje nowe wiersze
INSERT INTO t (kol) VALUES (val)
UPDATE
Zmienia istniejące wiersze
UPDATE t SET kol=val WHERE warunek
DELETE
Usuwa wiersze z tabeli
DELETE FROM t WHERE warunek
SELECT
Odczytuje dane (tylko odczyt)
SELECT kol FROM t WHERE warunek
🔄

Cykl życia transakcji

START TRANSACTION
Otwiera blok
INSERT / UPDATE / DELETE
Operacje na danych
COMMIT
Zatwierdza na stałe
lub
ROLLBACK
Cofa wszystko
🎮

Baza danych: GameVault

Ta sama baza GameVault co w module 19. Jeśli nie masz jej jeszcze, wklej skrypt inicjujący z poprzedniej lekcji.

🧑 gracze
gracz_idINT PK
nickVARCHAR
emailVARCHAR
krajVARCHAR
🎮 gry
gra_idINT PK
tytulVARCHAR
gatunekVARCHAR
cenaDECIMAL
wydawca_idFK
🛒 zakupy
zakup_idINT PK
gracz_idFK
gra_idFK
data_zakupuDATE
cena_zakupuDECIMAL
🏢 wydawcy
wydawca_idINT PK
nazwaVARCHAR
krajVARCHAR
⌨️

Ćwiczenia krok po kroku

01
INSERT — dodawanie nowych graczy
INSERT INTO
ZADANIE
Dodaj nowego gracza „CyberKing" z Polski. Następnie dodaj trzech graczy jednym poleceniem INSERT.
SQL
-- Dodanie jednego gracza
INSERT INTO gracze (nick, email, kraj)
VALUES ('CyberKing', 'king@gm.pl', 'PL');

-- Dodanie wielu graczy jednym INSERT
INSERT INTO gracze (nick, email, kraj) VALUES
    ('GhostRider', 'ghost@gm.us', 'US'),
    ('StarCraft99', 'star@gm.de', 'DE'),
    ('LagMaster',  'lag@gm.pl',  'PL');

-- Sprawdzenie
SELECT * FROM gracze;
💡 Nie podajemy gracz_id — jest AUTO_INCREMENT, baza nada go automatycznie.
02
UPDATE — zmiana cen i danych graczy
UPDATE · WHERE
ZADANIE
Zmień nick gracza o gracz_id = 1 na „ShadowWolf_PL". Następnie podnieś ceny wszystkich gier RPG o 10%.
⚠️ Zawsze sprawdź najpierw SELECT — upewnij się, że WHERE trafia dokładnie w te rekordy, które chcesz zmienić!
SQL
-- Najpierw sprawdź co zmieniasz
SELECT gracz_id, nick FROM gracze WHERE gracz_id = 1;

-- Zmiana nicka konkretnego gracza
UPDATE gracze
SET    nick = 'ShadowWolf_PL'
WHERE  gracz_id = 1;

-- Podwyżka cen wszystkich gier RPG o 10%
UPDATE gry
SET    cena = cena * 1.10
WHERE  gatunek = 'RPG';

-- Sprawdzenie
SELECT tytul, cena FROM gry WHERE gatunek = 'RPG';
03
DELETE — usuwanie z podzapytaniem
DELETE · Subquery
ZADANIE
Usuń wszystkich graczy z Niemiec (DE), którzy nie mają żadnych zakupów — "nieaktywnych" użytkowników.
⚠️ DELETE jest nieodwracalny bez transakcji! Zawsze najpierw wykonaj SELECT z tym samym WHERE.
SQL
-- Krok 1: Sprawdź co usuniesz (nigdy nie pomijaj!)
SELECT gracz_id, nick, kraj
FROM   gracze
WHERE  kraj = 'DE'
  AND  gracz_id NOT IN (
      SELECT gracz_id FROM zakupy
  );

-- Krok 2: Dopiero teraz usuń
DELETE FROM gracze
WHERE  kraj = 'DE'
  AND  gracz_id NOT IN (
      SELECT gracz_id FROM zakupy
  );
💡 Gracze z zakupami zostają — klucz obcy i tak by nie pozwolił ich usunąć bez CASCADE.
04
Transakcja z COMMIT — bezpieczny zakup
START TRANSACTION · COMMIT
ZADANIE
W jednej transakcji: dodaj zakup gry „Portal 2" przez gracza „NeonByte" i zaktualizuj jego email. Jeśli wszystko się powiedzie — zatwierdź.
SQL
START TRANSACTION;

-- 1. Nowy zakup gry Portal 2 przez NeonByte
INSERT INTO zakupy (gracz_id, gra_id, data_zakupu, cena_zakupu)
VALUES (
    (SELECT gracz_id FROM gracze WHERE nick = 'NeonByte'),
    (SELECT gra_id   FROM gry    WHERE tytul = 'Portal 2'),
    CURRENT_DATE,
    39.99
);

-- 2. Aktualizacja emaila
UPDATE gracze
SET    email = 'neonbyte_new@gm.us'
WHERE  nick  = 'NeonByte';

-- Wszystko OK — zatwierdzamy
COMMIT;
05
Transakcja z ROLLBACK — cofanie błędu
START TRANSACTION · ROLLBACK
ZADANIE
Zmień tymczasowo ceny wszystkich gier na 0 zł — a potem cofnij zmiany przez ROLLBACK. Udowodnij SELECT-em, że dane wróciły.
SQL
-- Stan przed zmianą
SELECT tytul, cena FROM gry;

START TRANSACTION;

-- "Błąd" — zerujemy wszystkie ceny
UPDATE gry SET cena = 0.00;

-- Wygląda źle...
SELECT tytul, cena FROM gry;

-- Cofamy wszystko!
ROLLBACK;

-- Ceny wróciły
SELECT tytul, cena FROM gry;
💡 ROLLBACK działa tylko przed COMMIT. Po zatwierdzeniu zmiany są trwałe — nie da się ich cofnąć przez ROLLBACK!
06
ON DELETE CASCADE — automatyczne usuwanie
FOREIGN KEY · CASCADE
ZADANIE
Odtwórz tabelę zakupy z opcją ON DELETE CASCADE. Usuń gracza — sprawdź, że jego zakupy zniknęły automatycznie.
SQL
DROP TABLE IF EXISTS zakupy;

CREATE TABLE zakupy (
    zakup_id    INT PRIMARY KEY AUTO_INCREMENT,
    gracz_id    INT,
    gra_id      INT,
    data_zakupu DATE,
    cena_zakupu DECIMAL(7,2),
    FOREIGN KEY (gracz_id) REFERENCES gracze(gracz_id)
        ON DELETE CASCADE,
    FOREIGN KEY (gra_id) REFERENCES gry(gra_id)
);

-- Dodaj testowy zakup dla gracza_id=2
INSERT INTO zakupy (gracz_id, gra_id, data_zakupu, cena_zakupu)
VALUES (2, 2, '2024-12-01', 149.99);

-- Zakupy przed usunięciem
SELECT * FROM zakupy;

-- Usuń gracza — zakupy znikają automatycznie
DELETE FROM gracze WHERE gracz_id = 2;

-- Zakupów gracza 2 już nie ma
SELECT * FROM zakupy;
⚠️ ON DELETE CASCADE usuwa dane automatycznie i nieodwracalnie — stosuj świadomie!
🚀

Zadanie projektowe

● INF.03 · PROJEKT KOŃCOWY

Operacje na danych GameVault

Wykonaj poniższe operacje na bazie GameVault. Każde polecenie opatrz komentarzem SQL (--). Zapisz do pliku .sql.

🧠

Quiz — sprawdź wiedzę

Q1Co się stanie, jeśli wykonasz UPDATE bez klauzuli WHERE?
AZapytanie zwróci błąd składniowy
BZostaną zaktualizowane WSZYSTKIE rekordy w tabeli
CNie wykona żadnej operacji
DZaktualizuje tylko pierwszy rekord
Q2Czym różni się COMMIT od ROLLBACK?
ACOMMIT cofa zmiany, ROLLBACK je zatwierdza
BCOMMIT zapisuje i zatwierdza zmiany, ROLLBACK cofa wszystkie operacje w transakcji
CSą identyczne — oba kończą transakcję
DROLLBACK usuwa tabelę, COMMIT ją tworzy
Q3Do czego służy ON DELETE CASCADE?
AAutomatycznie usuwa powiązane rekordy w tabeli podrzędnej po usunięciu rekordu nadrzędnego
BBlokuje możliwość usunięcia rekordu z powiązaniami
CKopiuje rekord do tabeli archiwalnej przed usunięciem
DWymaga ręcznego potwierdzenia przed usunięciem
Q4Czy po wykonaniu COMMIT można użyć ROLLBACK, aby cofnąć zmiany?
ATak — ROLLBACK zawsze cofa ostatnią operację
BNie — po COMMIT zmiany są trwałe i nie można ich cofnąć przez ROLLBACK
CTak — ale tylko w ciągu 5 minut
DZależy od wersji MySQL
Q5Jak dodać wiele wierszy jednym poleceniem INSERT?
AUżyć pętli FOR w SQL
BINSERT INTO tabela VALUES (...), (...), (...)
CUżyć MULTI INSERT z oddzielnym zapytaniem
DNie można — tylko jeden wiersz na INSERT
0/5

Checklista umiejętności

Postęp0 / 8
Dodaję rekordy przez INSERT (pojedyncze i wiele)
Aktualizuję dane z warunkiem WHERE w UPDATE
Używam UPDATE z podzapytaniem
Bezpiecznie usuwam rekordy przez DELETE + WHERE
Stosuję transakcje: START, COMMIT, ROLLBACK
Wiem kiedy użyć COMMIT, a kiedy ROLLBACK
Konfiguruję ON DELETE CASCADE w kluczu obcym
Zawsze sprawdzam SELECT-em przed UPDATE/DELETE