Vezérlőpult
8. DELETE — sorok törlése · Módosítás és törlés

4. blokk · Módosítás és törlés · 8. témakör

DELETE — sorok törlése

A DELETE sorokat töröl egy táblából. Egyszerű utasítás — mégis itt esik a legtöbb végzetes hiba: egy elfelejtett WHERE az egész táblát kiürítheti. Megnézzük a biztonságos törlést, az idegen kulcsok védelmét, és a DELETE/TRUNCATE/DROP különbségét — élő gyakorlóval.

Élő SQL-gyakorlóFK-védelem élőben10 kvízkérdés9 feladat

Tanulási célok

1Mi a DELETE?

A DELETE a DML (adatmanipuláció) része, akárcsak az INSERT és az UPDATE. Egész sorokat távolít el a táblából — nem egyes oszlopértékeket (azokat az UPDATE módosítja). A tábla szerkezete (oszlopai) megmarad, csak a benne lévő adatok fogynak.

ℹ️ SOR, NEM OSZLOP

A DELETE mindig teljes sorokat töröl. Ha csak egy oszlop értékét akarod „kitörölni”, azt az UPDATE … SET oszlop = NULL teszi (a következő témakör).

2Alap DELETE + WHERE

A leggyakoribb forma: megadjuk a táblát, és egy WHERE feltétellel azt, mely sorokat töröljük. Csak azok a sorok törlődnek, amelyekre a feltétel igaz:

-- A 7-es azonosítójú termék törlése:
DELETE FROM termek
WHERE id = 7;

-- A "torolve" állapotú rendelések törlése:
DELETE FROM rendeles
WHERE statusz = 'torolve';

A WHERE ugyanúgy működik, mint a SELECT-nél: használhatsz =, <, >, AND, OR, IN, LIKE, BETWEEN operátorokat.

3A WHERE nélküli DELETE — a leggyakoribb katasztrófa

Ha elhagyod a WHERE-t, a DELETE a tábla ÖSSZES sorát törli. Nincs „biztos vagy benne?” kérdés — azonnal végrehajtódik.

-- ⚠ VESZÉLY: ez a tábla MINDEN sorát törli!
DELETE FROM termek;
-- A termek tábla üres lesz. Visszavonni csak mentésből lehet.
⛔ MINDIG ELLENŐRIZD A WHERE-T

Mielőtt DELETE-et futtatsz, győződj meg róla, hogy ott van a WHERE, és pontosan azt szűri, amit akarsz! Egy elgépelt vagy hiányzó feltétel éles adatbázison azonnali, visszafordíthatatlan adatvesztést okoz. Sok DELETE-hiba abból ered, hogy valaki a feltételt csak később akarta hozzáírni.

4Feltételes törlés (operátorok, subquery)

-- Több feltétel:
DELETE FROM termek
WHERE keszlet = 0 AND ar < 1000;

-- Beágyazott lekérdezéssel: töröljük a rendelés nélküli vásárlókat
DELETE FROM vasarlo
WHERE id NOT IN (SELECT vasarlo_id FROM rendeles);
✅ ELŐBB SELECT, AZTÁN DELETE

Bevált szokás: futtasd le előbb ugyanazzal a WHERE-rel egy SELECT-et (SELECT * FROM termek WHERE …), nézd meg, pontosan mely sorok jönnének, és csak ha stimmel, cseréld a SELECT *-ot DELETE-re.

5DELETE és az idegen kulcs

Az idegen kulcsok megvédik az adatok épségét törléskor is. Ha egy sorra hivatkozik egy másik tábla (pl. a vásárlóhoz tartozik rendelés), akkor a vásárló nem törölhető csak úgy — különben „árva” rendelések maradnának.

DELETE FROM vasarlo WHERE id = 1;
-- Hiba: Cannot delete or update a parent row:
-- a foreign key constraint fails (a vásárlónak van rendelése)

Hogy mi történjen ilyenkor, azt az idegen kulcs ON DELETE szabálya dönti el (lásd a CREATE témakört):

ON DELETE szabályMi történik a szülő törlésekor
RESTRICT / NO ACTIONMegtiltja a törlést, amíg van rá hivatkozó gyermeksor (ez az alapértelmezett).
CASCADEA szülővel együtt a gyermeksorok is automatikusan törlődnek.
SET NULLA gyermek idegen kulcsa NULL-ra áll (ha az oszlop engedi a NULL-t).
✅ HELYES SORREND

RESTRICT esetén a törlést „alulról felfelé” végezd: előbb a gyermeksorokat (pl. rendeles_tetel, majd rendeles), és csak utána a szülőt (vasarlo).

6DELETE vs TRUNCATE vs DROP

Három különböző „törlés” létezik — fontos, hogy ne keverd őket:

DELETETRUNCATEDROP
Mit törölSorokat (WHERE-rel szűrhető)Az összes sort (gyorsan)Az egész táblát (szerkezetestül)
WHERE?IgenNemNem
Megmarad a tábla?IgenIgenNem
CsoportDMLDDLDDL
-- A cim tábla gyors kiürítése — a szerkezet megmarad, az id-számláló 1-re áll vissza:
TRUNCATE TABLE cim;

-- (DELETE FROM cim; után a számozás folytatódna — TRUNCATE után elölről indul.)

Vigyázat: olyan táblát, amelyre idegen kulcs hivatkozik (a webshopban pl. vasarlo, termek, rendeles), a TRUNCATE nem enged kiüríteni — hibát ad akkor is, ha a hivatkozó tábla éppen üres. Az ilyen táblák kiürítése DELETE-tel megy, a helyes (alulról felfelé) sorrendben.

⚠️ A GYAKORLÓBAN

A TRUNCATE MySQL-parancs; az alábbi SQLite-gyakorló nem ismeri (ott a tábla kiürítése DELETE FROM tabla-val történik). Ha kipróbálod, a gyakorló jelzi.

7Biztonságos törlés

Éles adatbázison a törlés mindig kockázat. Néhány bevált védelem:

-- Tranzakcióval védve: ha mégsem jó, visszavonjuk
BEGIN;
  DELETE FROM termek WHERE keszlet = 0;
  -- ... ellenőrzöd; ha hibás:
ROLLBACK;   -- visszavonja a törlést
-- ha rendben volt: COMMIT; (véglegesít)

Safe updates mód — a kapcsolója

A Workbench alapból bekapcsolt „safe updates” móddal dolgozik: a kulcs nélküli (WHERE nélküli) DELETE/UPDATE-et el sem futtatja, hanem Error Code: 1175 hibát ad. Ha egyszer szándékosan kell WHERE nélkül törölnöd, a védelmet ideiglenesen kikapcsolhatod — de utána mindig kapcsold vissza:

-- 1. A védelem kikapcsolása (0 = kikapcsolva):
SET SQL_SAFE_UPDATES = 0;

-- 2. Most már lefut a WHERE nélküli törlés is:
DELETE FROM rendeles_tetel;

-- 3. A védelem visszakapcsolása (1 = bekapcsolva) — ne maradjon kikapcsolva!
SET SQL_SAFE_UPDATES = 1;
ℹ️ CSAK A KAPCSOLATRA ÉRVÉNYES

A SET SQL_SAFE_UPDATES csak az aktuális kapcsolat (munkamenet) beállítását módosítja — újracsatlakozás után ismét a Workbench saját beállítása él (Edit → Preferences → SQL Editor → Safe Updates).

8Élő SQL-gyakorló

Próbáld ki a törlést a webshopon! Itt be van kapcsolva az idegenkulcs-ellenőrzés, így láthatod az FK-védelmet működés közben. Ha „elrontasz” valamit, az Adatok újratöltése gomb mindent visszaállít.

SQL-gyakorló — DELETE

SQL-motor betöltése…
⚠️ A GYAKORLÓRÓL

A motor SQLite-alapú, bekapcsolt idegenkulcs-ellenőrzéssel. A DELETE, a WHERE és a tranzakció (BEGIN/ROLLBACK) azonos a MySQL-lel. A TRUNCATE viszont MySQL-specifikus — ha kipróbálod, a gyakorló jelzi. (Internetkapcsolat szükséges a motorhoz.)

9Feladatok

Gyakorló feladatok

⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás — a kódírós feladatokat futtasd is le a fenti élő gyakorlóban!

8.1⭐

Írd le fejből a DELETE alap szerkezetét (sablonként)!

8.2⭐

Mi a bevált első lépés egy törlés előtt, hogy ne törölj rosszat?

8.3⭐⭐

Sorold fel a három ON DELETE szabályt, és röviden, mit tesznek!

8.4⭐

Mit csinál ez az utasítás?

DELETE FROM rendeles WHERE statusz = 'torolve';
8.5⭐⭐⭐

Miért veszélyes ez, és hogyan javítanád?

DELETE FROM termek
8.6⭐⭐⭐

Mit töröl ez a lekérdezés? (Gondolj a 7d. témakör NOT IN csapdájára is!)

DELETE FROM vasarlo
WHERE id NOT IN (SELECT vasarlo_id FROM rendeles);
8.7⭐

Kódírás: töröld azt a terméket, amelynek a neve pontosan „Régi USB hub”!

8.8⭐⭐

Kódírás: töröld azokat a termékeket, amelyek kifogytak (keszlet = 0) és olcsóbbak 1000 Ft-nál!

8.9⭐⭐⭐

Kódírás: tranzakcióval töröld a „torolve” állapotú rendeléseket, de építsd be a visszavonás lehetőségét (ROLLBACK)! Ellenőrizd SELECT COUNT(*)-gal a törlés előtti és utáni állapotot.

10Önellenőrző kvíz

Ellenőrizd magad!

Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.

11Fogalomtár

FogalomJelentés
DELETEteljes sorok törlése (DML) — a tábla szerkezete megmarad
WHERE nélküli DELETEa tábla ÖSSZES sorát törli — a leggyakoribb végzetes hiba
„előbb SELECT” mintaugyanazzal a WHERE-rel előbb SELECT — ellenőrzés törlés előtt
FK-védelem · árva sorhivatkozott szülő sor nem törölhető, hogy ne maradjon árva gyermek
ON DELETE szabályokRESTRICT (tilt) · CASCADE (továbbgyűrűztet) · SET NULL (NULL-ra állít)
TRUNCATEa tábla gyors kiürítése (DDL) — AUTO_INCREMENT nullázódik, nem visszavonható; hivatkozott (szülő) táblára hibát ad
DROPa teljes tábla megszüntetése szerkezetestül
tranzakcióBEGIN → műveletek → ROLLBACK (visszavon) vagy COMMIT (véglegesít)
safe updates móda Workbench védelme a kulcs nélküli DELETE/UPDATE ellen — kapcsolója: SET SQL_SAFE_UPDATES = 0 / 1

12Összegzés

  1. A DELETE teljes sorokat töröl (DML); a tábla szerkezete megmarad.
  2. DELETE FROM tabla WHERE feltétel; — csak az illeszkedő sorok törlődnek.
  3. WHERE nélkül az ÖSSZES sor törlődik — mindig ellenőrizd a feltételt!
  4. Az idegen kulcs megvédi a hivatkozott (szülő) sorokat; az ON DELETE szabály (RESTRICT / CASCADE / SET NULL) dönt.
  5. DELETE (sorok, WHERE) ≠ TRUNCATE (az egész tábla gyors ürítése) ≠ DROP (a tábla megszüntetése).
  6. Biztonság: előbb SELECT, tranzakció + ROLLBACK, safe updates (SET SQL_SAFE_UPDATES = 0/1), mentés.