-- 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);
| Cecha | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| Co usuwa | Wybrane wiersze (lub wszystkie) | Wszystkie wiersze | Całą tabelę (struktura + dane) |
| Można cofnąć (ROLLBACK)? | TAK (DML, w transakcji) | NIE (DDL, auto-commit) | NIE (DDL) |
| Resetuje AUTO_INCREMENT? | NIE | TAK | – |
| Szybkość | Wolniejszy (loguje każdy wiersz) | Bardzo szybki | Natychmiastowy |
| Wyzwalacze (TRIGGERS) | Uruchamia DELETE trigger | NIE uruchamia | – |
| WHERE możliwe? | TAK | NIE | NIE |
| Blokuje FK? | Tak, jeśli są powiązane rekordy | Tak, jeśli są powiązane rekordy | Tak, 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
-- 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;
deleted_at na aktualny czas. Dane można odzyskać, a historia jest zachowana.
Masz tabelę z 100 wierszami i AUTO_INCREMENT. Po której operacji numerowanie nowych wierszy zacznie się od 1?
Dopasuj właściwe polecenie do sytuacji:
Tabela zamowienia(id_zamowienia, id_klienta, data, kwota). Napisz DELETE usuwający zamówienia starsze niż 2 lata od dziś:
DELETE FROM tabela WHERE warunek; — usuwa wybrane wiersze (można cofnąć w transakcji)TRUNCATE TABLE tabela; — czyści całą tabelę, resetuje AUTO_INCREMENT, NIE można cofnąćDROP TABLE tabela; — usuwa tabelę razem ze strukturąON DELETE CASCADE — automatycznie usuwa powiązane rekordydeleted_at = NOW() — dane da się odzyskać