2. blokk · Táblák és adatok · 6. témakör
A táblák készen állnak — itt az ideje feltölteni őket adatokkal. Az INSERT utasítással új sorokat szúrunk be: egyet vagy többet egyszerre, akár egy másik tábla adataiból is. A témakör végén élőben is feltöltheted a webshopot.
Az INSERT az adatmanipulációs nyelv (DML) része —
szemben a CREATE/ALTER szerkezetkezelő (DDL) utasításaival, az INSERT magukkal az
adatokkal dolgozik: új sorokat ad a táblához.
| Csoport | Utasítások | Mit kezel |
|---|---|---|
| DDL | CREATE, ALTER, DROP | Szerkezet (táblák, oszlopok) |
| DML | INSERT, UPDATE, DELETE | Adatok (sorok) |
| DQL | SELECT | Adatok lekérdezése (következő témakör) |
A leggyakoribb forma: megadjuk a tábla nevét, az oszlopok listáját, majd a
VALUES után a hozzájuk tartozó értékeket —
ugyanabban a sorrendben.
INSERT INTO vasarlo (vezeteknev, keresztnev, email, regisztracio_datuma) VALUES ('Nagy', 'Anna', 'nagy.anna@pelda.hu', '2026-01-12');
'Anna', '2026-01-12'.6990.Az oszloplista technikailag elhagyható, ha minden oszlopnak, pontosan a tábla sorrendjében adsz értéket:
-- Működik, de TÖRÉKENY (a táblabeli sorrendtől függ): INSERT INTO vasarlo VALUES (1, 'Nagy', 'Anna', 'nagy.anna@pelda.hu', '2026-01-12');
Az oszloplista elhagyása veszélyes: ha valaki később ALTER-rel
átrendezi vagy bővíti a táblát, a kód némán rossz oszlopba ír. Az explicit oszloplista
(INSERT INTO vasarlo (vezeteknev, ...)) olvashatóbb és
biztonságosabb — ezt szokd meg!
Több sort egyetlen utasítással is beszúrhatunk — a VALUES után
vesszővel elválasztott zárójeles csoportokkal. Ez gyorsabb is, mint külön utasításokban.
INSERT INTO kategoria (nev, szulo_id) VALUES ('Elektronika', NULL), ('Számítógép', 1), ('Periféria', 1);
Sok ezer sor egyszerre? A több soros INSERT sokkal gyorsabb, mint ugyanannyi különálló utasítás, mert egyszer kell „kommunikálni” a szerverrel.
Az id oszlopot a szerver automatikusan kitölti. Egyszerűen
hagyd ki az oszloplistából — így nem kell tudnod, mi a következő szám:
-- Az id kimarad → a szerver adja (pl. 1, 2, 3, ...): INSERT INTO termek (nev, ar, keszlet, kategoria_id) VALUES ('Vezeték nélküli egér', 6990, 40, 3);
Két eset van, és mindkettő szabályos:
-- id = NULL → a szerver adja a következő sorszámot: INSERT INTO termek (id, nev, ar, keszlet, kategoria_id) VALUES (NULL, 'Webkamera', 12990, 30, 3); -- id = 100 → pontosan a 100-as id-t kapja: INSERT INTO termek (id, nev, ar, keszlet, kategoria_id) VALUES (100, 'Dokkoló', 24990, 8, 2);
Fix id után a számláló igazodik: a következő automatikus sorszám a legnagyobb érték után folytatódik (a példában 101 lesz), így később sem lesz ütközés. Fix id-t jellemzően mentés visszatöltésekor használunk — a 8. szakasz dumpjai pontosan így, az eredeti id-kkal szúrják vissza a sorokat, hogy az idegen kulcs hivatkozások ne csússzanak el.
MySQL-ben (alapbeállítás mellett) az id-nak adott 0 is a
következő automatikus sorszámot kéri, akárcsak a NULL. A lenti gyakorló SQLite-motorja
viszont a 0-t szó szerint szúrná be — ezt ezért élesben, Workbenchben próbáld ki.
NULL-t, és nincs értéked, írhatsz NULL-t, vagy kihagyhatod az oszlopot.DEFAULT értéke, és kihagyod, az alapérték kerül be. Pl. a keszlet kihagyásakor (DEFAULT 0) a készlet 0 lesz, a statusz kihagyásakor (DEFAULT 'uj') az állapot „uj”.-- keszlet kimarad → DEFAULT 0 lesz: INSERT INTO termek (nev, ar, kategoria_id) VALUES ('Egér alátét', 1990, 3);
Beszúrhatunk olyan sorokat is, amelyek értékeit egy lekérdezés adja. Ezzel adatokat másolhatunk, archiválhatunk, vagy összegezhetünk egy másik táblába.
-- Az olcsó termékeket átmásoljuk egy akciós táblába: INSERT INTO akcios_termek (nev, ar) SELECT nev, ar FROM termek WHERE ar < 10000;
Itt nincs VALUES — a SELECT sorai
lesznek a beszúrt sorok. A SELECT oszlopainak sorrendje és száma a cél-oszloplistához kell
igazodjon. (A SELECT-tel a következő témakörben foglalkozunk részletesen.)
Az idegen kulcsok miatt a táblákat a megfelelő sorrendben kell feltölteni: előbb a szülő (hivatkozott) sor, csak utána a rá hivatkozó gyermek. A webshopnál ez azt jelenti:
kategoria és vasarlo (ezekre hivatkoznak mások).termek (kategóriára hivatkozik) és rendeles (vásárlóra).rendeles_tetel (rendelésre ÉS termékre is hivatkozik).| Hiba | Ok | Megoldás |
|---|---|---|
| Duplicate entry / UNIQUE | Ismétlődő egyedi érték (pl. már létező e-mail vagy id) | Egyedi értéket adj; az id-t hagyd a szerverre |
| Column cannot be null | NOT NULL oszlopnak nem adtál értéket | Add meg a kötelező mezőt (pl. ar, nev) |
| Cannot add / foreign key fails | Nem létező szülő sorra hivatkozó idegen kulcs | Előbb szúrd be a szülő sort (helyes sorrend) |
| Column count doesn't match | Az oszlopok és értékek száma eltér | Egyezzen az oszlopok és a VALUES száma |
A MySQL-ben van egy hasznos kiegészítés:
INSERT ... ON DUPLICATE KEY UPDATE ... — ha a beszúrás ütközne
egy egyedi kulccsal (PRIMARY KEY vagy UNIQUE), akkor a meglévő sort frissíti a
beszúrás helyett:
-- Árukészlet érkezett. Ha az 1-es id még szabad lenne, beszúrná a sort — -- de mivel már foglalt, beszúrás helyett a készletet növeli: INSERT INTO termek (id, nev, ar, keszlet, kategoria_id) VALUES (1, 'Vezeték nélküli egér', 6990, 40, 3) ON DUPLICATE KEY UPDATE keszlet = keszlet + 40;
Ez MySQL-specifikus (az alábbi gyakorló SQLite-motorja másképp oldja meg, ezért ott jelzést kapsz, ha kipróbálod).
A táblák szerkezete és az adatok is megvannak — ideje gondoskodni róluk! Az adatbázisról
rendszeresen érdemes biztonsági mentést készíteni. A Workbench Navigatorában
(Management → Data Export) kiválaszthatjuk a sémát/táblákat, és egy
.sql fájlba — úgynevezett dumpba — menthetjük:
A visszatöltés a Management → Data Import/Restore ponttal történik — így hozható
vissza egy korábbi mentés, vagy tölthető be akár egy mástól kapott
.sql fájl is.
Egy .sql dump nem más, mint SQL-utasítások sorozata:
CREATE TABLE-ök és INSERT-ek —
pontosan azok, amiket ebben a blokkban tanultunk. Ezért egy dump a Query Editorban
megnyitva és lefuttatva is visszatölthető.
Töltsd fel a webshopot! Az alapból betöltött adatokhoz adj újakat, vagy kezdj tiszta lappal az
„Üres táblák” gombbal, és töltsd fel te magad — végül egy
SELECT-tel ellenőrizd az eredményt.
A motor SQLite-alapú (a böngészőben fut), és automatikusan kezeli a
tananyag MySQL-szintaxisát. Az INSERT (egy és több soros), az
INSERT ... SELECT, a NULL/DEFAULT és az auto-increment ugyanúgy
működik, mint MySQL-ben. A MySQL-specifikus
ON DUPLICATE KEY UPDATE itt nem fut — ha kipróbálod, a gyakorló
megmagyarázza, miért. (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 INSERT alap szerkezetét (sablonként, a tábla- és oszlopnevek helyén helykitöltőkkel)!
Kódírás: szúrj be három kategóriát egyetlen utasítással!
Mi a MySQL ON DUPLICATE KEY UPDATE lényege egy mondatban?
Mi a hiba az alábbi utasításban? (A termek tábla oszlopai:
id, nev, ar, keszlet, kategoria_id.)
INSERT INTO termek (nev, ar) VALUES ('Webkamera', 12990, 30);
Miért ad hibát ez, ha a vasarlo tábla
email oszlopa UNIQUE, és már van
nagy.anna@pelda.hu? (Próbáld is ki a gyakorlóban!)
INSERT INTO vasarlo (vezeteknev, keresztnev, email) VALUES ('Nagy', 'Anna', 'nagy.anna@pelda.hu');
Üres adatbázisban ez a két INSERT ebben a sorrendben hibát ad. Miért? (Az „Üres táblák” gombbal ki is próbálhatod.)
INSERT INTO termek (nev, ar, kategoria_id) VALUES ('Egér', 6990, 1); INSERT INTO kategoria (nev) VALUES ('Periféria');
Kódírás: szúrj be egy új vásárlót: Tóth Csaba, e-mail
toth.csaba@pelda.hu, regisztráció 2026-02-18.
(Az id-t hagyd a szerverre!)
Kódírás: szúrj be két terméket egyetlen utasítással: „Laptop 15 coll” 289 990 Ft, 5 db, 2-es kategória; és „USB pendrive 64GB” 3490 Ft, 100 db, 3-as kategória!
Kódírás: hozz létre egy rendelést a 2-es vásárlónak (dátum: 2026-03-07 09:15:00), majd adj hozzá egy tételt: az 1-es termékből 2 db, 6990 Ft egységáron! Figyelj a sorrendre — melyik INSERT jön előbb, és miért?
Egy kolléga elküldött egy webshop.sql dump fájlt. Hogyan töltöd
be a saját szerveredre a Workbenchből? Írd le a lépéseket — és azt is, milyen
alternatív módon futtathatnád le a fájlt!
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelentés |
|---|---|
| DML | adatmanipulációs nyelv: INSERT, UPDATE, DELETE — a sorokkal dolgozik |
| INSERT INTO ... VALUES | új sor(ok) beszúrása: tábla + oszloplista + értékek |
| oszloplista | a kitöltendő oszlopok explicit felsorolása — mindig add meg! |
| több soros INSERT | VALUES (...), (...), (...) — gyorsabb, mint külön utasítások |
| aposztróf | szöveg és dátum jelölése: 'Anna', '2026-01-12'; szám idézőjel nélkül |
| AUTO_INCREMENT kihagyása | az id-t a szerver adja — kihagyjuk (a NULL ugyanezt kéri; fix érték konkrét id-t szúr be) |
| DEFAULT | kihagyott oszlopnál az alapértelmezett érték kerül be |
| INSERT ... SELECT | egy lekérdezés sorainak beszúrása — másolás, archiválás |
| feltöltési sorrend | előbb a szülő (hivatkozott) sor, utána a gyermek |
| ON DUPLICATE KEY UPDATE | MySQL-extra: kulcsütközéskor beszúrás helyett frissít |
| dump · Data Export / Import | a mentés .sql fájlja (CREATE + INSERT utasítások) · a Workbench mentő/visszatöltő eszköze |
INSERT új sorokat ad a táblához (DML).INSERT INTO tábla (oszlopok) VALUES (értékek); —
szöveg/dátum aposztrófban, szám anélkül.VALUES (...), (...)
csoportok.AUTO_INCREMENT id-t hagyd ki (a NULL ugyanazt kéri, fix
érték konkrét id-t szúr be); a DEFAULT és
NULL oszlopok kihagyhatók.INSERT ... SELECT — sorok beszúrása egy lekérdezés
eredményéből.