🎯 Cele lekcji

🗑️

1. DELETE FROM — usuwanie wierszy

-- Usuń konkretny rekord (bezpieczne — z WHERE)
DELETE FROM klienci
WHERE id_klienta = 42;

-- Usuń wszystkie rekordy spełniające warunek
DELETE FROM logi
WHERE data_log < '2022-01-01';

-- DELETE z JOIN (MySQL) — usuń zamówienia klientów nieaktywnych
DELETE z
FROM zamowienia z
INNER JOIN klienci k ON z.id_klienta = k.id_klienta
WHERE k.aktywny = 0;

-- Usuń zamówienia starsze niż 2 lata
DELETE FROM zamowienia
WHERE data < DATE_SUB(NOW(), INTERVAL 2 YEAR);
DELETE bez WHERE usuwa WSZYSTKIE rekordy z tabeli! Tak jak przy UPDATE, zawsze sprawdź warunek WHERE przed wykonaniem.
⚖️

2. DELETE vs TRUNCATE vs DROP

CechaDELETETRUNCATEDROP
Co usuwaWybrane wiersze (lub wszystkie)Wszystkie wierszeCałą tabelę (struktura + dane)
Można cofnąć (ROLLBACK)?TAK (DML, w transakcji)NIE (DDL, auto-commit)NIE (DDL)
Resetuje AUTO_INCREMENT?NIETAK
SzybkośćWolniejszy (loguje każdy wiersz)Bardzo szybkiNatychmiastowy
Wyzwalacze (TRIGGERS)Uruchamia DELETE triggerNIE uruchamia
WHERE możliwe?TAKNIENIE
Blokuje FK?Tak, jeśli są powiązane rekordyTak, jeśli są powiązane rekordyTak, jeśli są powiązane tabele
-- DELETE — usuwa wiersze, zachowuje strukturę
DELETE FROM koszyk WHERE sesja = 'abc123';

-- TRUNCATE — czyści całą tabelę, resetuje AUTO_INCREMENT
TRUNCATE TABLE sesje_tymczasowe;

-- DROP — usuwa całą tabelę ze strukturą
DROP TABLE stara_tabela;
DROP TABLE IF EXISTS stara_tabela; -- bezpieczniejsze
🔗

3. Kaskadowe usuwanie i SOFT DELETE

-- ON DELETE CASCADE — przy usunięciu klienta usuwa też jego zamówienia
CREATE TABLE zamowienia (
  id_zamowienia INT PRIMARY KEY,
  id_klienta    INT,
  FOREIGN KEY (id_klienta) REFERENCES klienci(id_klienta)
    ON DELETE CASCADE
);

-- ON DELETE SET NULL — przy usunięciu kategorii produkt traci kategorię
FOREIGN KEY (id_kategorii) REFERENCES kategorie(id_kategorii)
  ON DELETE SET NULL

-- SOFT DELETE — wzorzec: nie usuwamy fizycznie, tylko oznaczamy
ALTER TABLE klienci
  ADD COLUMN deleted_at DATETIME DEFAULT NULL;

-- "Usunięcie" klienta (soft delete)
UPDATE klienci
SET deleted_at = NOW()
WHERE id_klienta = 42;

-- Pobieranie tylko "aktywnych" (nieusunietych)
SELECT * FROM klienci
WHERE deleted_at IS NULL;
SOFT DELETE to popularny wzorzec w aplikacjach. Zamiast fizycznie usuwać rekord, ustawiamy kolumnę deleted_at na aktualny czas. Dane można odzyskać, a historia jest zachowana.
✏️

Zadania interaktywne

Zadanie 1Quiz: które polecenie resetuje AUTO_INCREMENT?

Masz tabelę z 100 wierszami i AUTO_INCREMENT. Po której operacji numerowanie nowych wierszy zacznie się od 1?

  • DELETE FROM tabela; (bez WHERE)
  • TRUNCATE TABLE tabela;
  • DELETE FROM tabela WHERE id > 0;
  • UPDATE tabela SET id = 0;
Zadanie 2Dopasuj polecenie do scenariusza

Dopasuj właściwe polecenie do sytuacji:

Chcę wyczyścić tabelę sesji tymczasowych (szybko, nie potrzebuję cofnąć)
Chcę usunąć konkretnego użytkownika po id
Porzucam stary projekt — chcę usunąć całą tabelę wraz ze strukturą
Zadanie 3Napisz DELETE: stare zamówienia

Tabela zamowienia(id_zamowienia, id_klienta, data, kwota). Napisz DELETE usuwający zamówienia starsze niż 2 lata od dziś:

📌 Zapamiętaj