4. blokk · Módosítás és törlés · 9. témakör
Az UPDATE meglévő sorok adatait módosítja: árat emel, készletet
csökkent, státuszt vált. A DELETE-hez hasonlóan itt is életbevágó a
WHERE — nélküle a teljes tábla minden sora
megváltozik. Megnézzük a több oszlopos módosítást, a kifejezéseket és a biztonságos
UPDATE-et — élő gyakorlóval. Ez a MySQL témakör záró fejezete.
keszlet = keszlet - 1).Az UPDATE a DML harmadik tagja (az INSERT és a
DELETE mellett). Meglévő sorok oszlopértékeit módosítja — nem ad hozzá és nem
töröl sorokat, csak a bennük lévő adatokat írja át.
| Utasítás | Mit csinál |
|---|---|
INSERT | Új sort ad hozzá |
UPDATE | Meglévő sor(ok) értékeit módosítja |
DELETE | Sor(oka)t töröl |
A szerkezet: UPDATE tábla, SET melyik
oszlop mi legyen, WHERE mely sorokra vonatkozzon.
UPDATE termek SET ar = 7990 WHERE id = 1; -- Az 1-es termék ára 7990 lesz; a többi sor változatlan.
SET után az oszlop = új_érték párokat adjuk meg.WHERE jelöli ki, mely sorokat érinti a módosítás (ugyanúgy, mint a SELECT/DELETE-nél).'uj'), szám anélkül (7990).Ahogy a DELETE-nél: ha elhagyod a WHERE-t, az
UPDATE a tábla ÖSSZES sorát módosítja.
-- ⚠ VESZÉLY: MINDEN termék ára 0 lesz! UPDATE termek SET ar = 0; -- Nem csak egy sor — az egész tábla. Visszavonni csak ROLLBACK-kel/mentésből.
A hiányzó WHERE az UPDATE-nél némán „felülír mindent” — nincs
hibaüzenet. Éles adatbázison ez tömeges adatromlást okoz. Mindig ellenőrizd a feltételt,
mielőtt futtatod!
Egyetlen UPDATE-ben több oszlopot is átírhatunk — a SET után
vesszővel elválasztva:
UPDATE termek SET ar = 9990, keszlet = 50, nev = 'Vezeték nélküli egér (új)' WHERE id = 1;
Az oszlop=érték párokat vessző választja el, nem
AND! (Az AND a WHERE-be való.)
Gyakori kezdő hiba a SET a = 1 AND b = 2 — ez nem két
értékadás, hanem egy logikai kifejezést rendel az a-hoz.
Az új érték lehet kifejezés is, amely akár a jelenlegi értékre épül. Így nem kell tudnunk a konkrét számot — relatív módosítást végezhetünk:
-- 10%-os áremelés minden termékre, egész forintra kerekítve: UPDATE termek SET ar = ROUND(ar * 1.10); -- Egy darab eladása: a készlet eggyel csökken UPDATE termek SET keszlet = keszlet - 1 WHERE id = 1; -- 20% akció a kifogyott termékekre (kiárusítás): UPDATE termek SET ar = ROUND(ar * 0.80) WHERE keszlet = 0;
(Az első, szándékosan WHERE nélküli áremelés éles Workbenchben csak a safe updates mód kikapcsolása után fut le — lásd a 7. szakaszt.)
A keszlet = keszlet - 1 kifejezésben a jobb oldali
keszlet a sor jelenlegi értéke. Így
biztonságosan léphetünk relatívan (növelés/csökkentés), versenyhelyzet nélkül.
A WHERE ugyanúgy használhat operátorokat és beágyazott
lekérdezést, mint a SELECT-nél:
-- Az "uj" státuszú rendelések átállítása "feldolgozas"-ra: UPDATE rendeles SET statusz = 'feldolgozas' WHERE statusz = 'uj'; -- Subquery a WHERE-ben: emeljük meg a "Periféria" kategória árait UPDATE termek SET ar = ROUND(ar * 1.05) WHERE kategoria_id = (SELECT id FROM kategoria WHERE nev = 'Periféria');
Ha különböző soroknak különböző új értéket akarsz adni egy menetben, használd a
CASE kifejezést:
SET ar = CASE WHEN keszlet = 0 THEN ar*0.8 ELSE ar END.
A védelmek ugyanazok, mint a DELETE-nél — az UPDATE ugyanúgy tömeges, visszafordíthatatlan kárt tud okozni:
BEGIN …
UPDATE …, és ROLLBACK-kel
visszavonod, ha nem jó; COMMIT-tal véglegesíted.ON UPDATE szabály (RESTRICT/CASCADE) szabályozza, akárcsak
törlésnél.-- 1) Előbb megnézzük, mit módosítanánk: SELECT id, nev, ar FROM termek WHERE keszlet = 0; -- 2) Ha stimmel, jöhet az UPDATE ugyanazzal a WHERE-rel: UPDATE termek SET ar = ROUND(ar * 0.80) WHERE keszlet = 0;
-- Szándékos, WHERE nélküli tömeges módosítás (pl. 10% áremelés MINDEN termékre): SET SQL_SAFE_UPDATES = 0; -- a safe updates védelem kikapcsolása UPDATE termek SET ar = ROUND(ar * 1.10); SET SQL_SAFE_UPDATES = 1; -- kapcsold vissza! (részletek: 8. témakör)
Módosíts a webshopon! A chipek tipikus UPDATE-mintákat töltenek be (áremelés, készletcsökkentés, státuszváltás). Az Adatok újratöltése gomb bármikor visszaállítja az eredeti állapotot.
A motor SQLite-alapú: az UPDATE, a SET, a kifejezések, a tranzakció és a
beágyazott lekérdezés azonos a MySQL-lel. Tipp: futtass egy módosítást, majd egy
SELECT-tel nézd meg az eredményt (több utasítás is mehet
egyszerre, pontosvesszővel elválasztva). (Internetkapcsolat szükséges a motorhoz.)
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás — a kódírós feladatokat futtasd is le a fenti élő gyakorlóban!
Írd le fejből az UPDATE alap szerkezetét (sablonként)!
Mivel választod el egymástól a módosítandó oszlopokat a SET
után?
Mi a bevált első lépés egy UPDATE előtt, hogy ne ronts el adatokat?
Mit csinál ez az utasítás?
UPDATE rendeles SET statusz = 'feldolgozas' WHERE statusz = 'uj';
Miért veszélyes ez, és hogyan javítanád?
UPDATE termek SET ar = 0;
Mit módosít ez, és mire figyelj a vesszővel kapcsolatban?
UPDATE termek SET ar = 9990, keszlet = 50 WHERE id = 1;
Kódírás: állítsd a 3-as termék árát 4990-re!
Kódírás: adj 15% akciót (árcsökkentést, egészre kerekítve) minden kifogyott (keszlet = 0) termékre!
Kódírás: tranzakcióval emeld 5%-kal a „Periféria” kategória termékeinek
árát (subquery a kategóriára), de építsd be a visszavonás lehetőségét
(ROLLBACK)! Ellenőrizd SELECT-tel a módosítás előtti és utáni
árakat.
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelentés |
|---|---|
| UPDATE · SET | meglévő sorok oszlopértékeinek átírása (DML) |
| WHERE nélküli UPDATE | a tábla ÖSSZES sora megváltozik — némán, hibaüzenet nélkül |
| több oszlop egyszerre | SET a = …, b = … — vesszővel, nem AND-del |
| kifejezés a SET-ben | az új érték a régire is épülhet: keszlet = keszlet - 1 |
| CASE a SET-ben | soronként más érték egyetlen UPDATE-ben |
| subquery a WHERE-ben | a módosítandó sorokat egy másik lekérdezés jelöli ki |
| ON UPDATE szabály | a hivatkozott kulcs módosítását szabályozza (RESTRICT/CASCADE) |
| „előbb SELECT” minta | ugyanazzal a WHERE-rel előbb SELECT — ellenőrzés módosítás előtt |
| safe updates mód | a Workbench védelme a kulcs nélküli UPDATE/DELETE ellen — kapcsolója: SET SQL_SAFE_UPDATES = 0 / 1 |
| tranzakció | BEGIN → UPDATE → ROLLBACK (visszavon) vagy COMMIT (véglegesít) |
UPDATE meglévő sorok oszlopértékeit módosítja (DML).UPDATE tabla SET oszlop = érték WHERE feltétel; — csak az
illeszkedő sorok módosulnak.SET a = …, b = … (vesszővel, nem AND-del).ar = ROUND(ar * 1.1),
keszlet = keszlet - 1.SET SQL_SAFE_UPDATES = 0/1), mentés.Ezzel végigvettük a teljes MySQL anyagot: tervezés, Workbench, EER-diagram, CREATE, ALTER, INSERT, a teljes SELECT (alapok, aggregáció, JOIN, beágyazott lekérdezések), DELETE és UPDATE. A következő nagy téma — amikor odaérünk — a webfejlesztés (JavaScript), majd a C#/Laravel backend lesz.