Vezérlőpult
5. ALTER utasítások · Táblák és adatok

2. blokk · Táblák és adatok · 5. témakör

ALTER utasítások

A táblák ritkán véglegesek: új igények jönnek, oszlopot kell hozzáadni, típust módosítani, megszorítást felvenni. Az ALTER TABLE a már létező táblák szerkezetét módosítja — anélkül, hogy újra kellene építeni őket. A témakör végén élőben is kipróbálhatod.

Élő SQL-gyakorló9 kvízkérdés9 feladatWebshop-séma

Tanulási célok

1Mi az ALTER TABLE?

Az ALTER TABLE a DDL utasítások közé tartozik (mint a CREATE), és egy létező tábla szerkezetét módosítja. A leggyakoribb műveletek:

CélKulcsszó
Új oszlop hozzáadásaADD COLUMN
Oszlop típusának módosításaMODIFY COLUMN
Oszlop átnevezése (+ típus)CHANGE COLUMN / RENAME COLUMN
Oszlop törléseDROP COLUMN
Megszorítás / index hozzáadása-törléseADD / DROP
Tábla átnevezéseRENAME TO
⚠️ ÓVATOSAN ÉLES ADATOKON

Az ALTER éles, adatokat tartalmazó táblán is fut, de egyes műveletek (pl. oszlop törlése, típusszűkítés) adatvesztéssel járhatnak, és nagy táblán lassúak lehetnek. Mindig legyen mentés, és teszteld előbb fejlesztői környezetben!

2Oszlop hozzáadása — ADD COLUMN

Tegyük fel, hogy a termékekhez szeretnénk egy leiras mezőt és egy letrehozva időbélyeget:

ALTER TABLE termek ADD COLUMN leiras TEXT;

-- Több művelet egyszerre, vesszővel elválasztva:
ALTER TABLE termek
  ADD COLUMN suly DECIMAL(6,2) NULL,
  ADD COLUMN aktiv TINYINT(1) NOT NULL DEFAULT 1;

Az új oszlop pozícióját is megadhatjuk (ez MySQL-specifikus kiegészítés). Pontosan három lehetőség van:

-- A vonalkod közvetlenül a nev mögé kerül:
ALTER TABLE termek ADD COLUMN vonalkod VARCHAR(20) AFTER nev;

-- Ugyanezek a jelölők MEGLÉVŐ oszlop áthelyezésére is jók (a MODIFY/CHANGE végén):
ALTER TABLE termek MODIFY COLUMN vonalkod VARCHAR(20) FIRST;
ℹ️ BEFORE NINCS

„Elé tevő” BEFORE jelölő nem létezik a MySQL-ben — ha egy oszlop elé szeretnél szúrni, használd az előtte álló oszlop AFTER-jét, a tábla elejére pedig a FIRST-öt.

✅ NOT NULL ÚJ OSZLOPNÁL

Ha létező adatokhoz adsz NOT NULL oszlopot, adj hozzá DEFAULT értéket is — különben a meglévő soroknak nem lenne mit beírni, és hibát kapsz.

3Oszlop módosítása

MODIFY COLUMN — típus / megszorítás módosítása (a név marad)

-- A leiras legyen VARCHAR(500) a TEXT helyett, és kötelező:
ALTER TABLE termek MODIFY COLUMN leiras VARCHAR(500) NOT NULL;

CHANGE COLUMN — átnevezés ÉS típus egyben

-- A 'leiras' oszlop új neve 'megnevezes', új típussal:
ALTER TABLE termek CHANGE COLUMN leiras megnevezes VARCHAR(300) NOT NULL;

RENAME COLUMN — csak átnevezés (egyszerűbb)

ALTER TABLE vasarlo RENAME COLUMN email TO email_cim;

(A RENAME COLUMN a MySQL 8.0 óta létezik — régebbi szerveren az átnevezés a CHANGE-dzsel oldható meg.)

UtasításÁtnevez?Típust állít?
MODIFY COLUMNNemIgen
CHANGE COLUMNIgenIgen (kötelező)
RENAME COLUMNIgenNem
ℹ️ A COLUMN SZÓ TÖBBNYIRE ELHAGYHATÓ

Az ADD, MODIFY, CHANGE és DROP után a COLUMN kulcsszó csak az olvashatóságot szolgálja — nélküle is ugyanúgy működik: ALTER TABLE termek ADD leiras TEXT;. Kivétel a RENAME COLUMN: ott a COLUMN kötelező, mert a sima RENAME a táblát nevezné át. (Megtévesztő lehet, hogy a lenti SQLite-alapú gyakorló a RENAME ar TO netto_ar formát is elfogadja — az SQLite-ban a COLUMN itt is elhagyható. Éles MySQL-en ez szintaxishiba!)

⚠️ TÍPUSVÁLTÁS = ADATKOCKÁZAT

Ha szűkebb típusra váltasz (pl. VARCHAR(500) → VARCHAR(50), vagy INT → TINYINT), a be nem férő adatok csonkolódhatnak vagy hibát okoznak. Ellenőrizd a meglévő adatokat módosítás előtt!

4Oszlop törlése — DROP COLUMN

ALTER TABLE termek DROP COLUMN vonalkod;
⛔ VISSZAVONHATATLAN

A DROP COLUMN az oszlopot az összes benne tárolt adattal együtt törli. Nincs „visszavonás” — ezért fontos a mentés.

5Megszorítások és indexek módosítása

Utólag is felvehetünk vagy eltávolíthatunk elsődleges/idegen kulcsot, egyedi megszorítást és indexet:

-- Egyedi megszorítás felvétele:
ALTER TABLE vasarlo ADD UNIQUE (email);

-- Index felvétele a gyorsabb kereséshez:
ALTER TABLE termek ADD INDEX idx_nev (nev);

-- Idegen kulcs felvétele (névvel, hogy később törölhető legyen):
ALTER TABLE rendeles
  ADD CONSTRAINT fk_rendeles_vasarlo
  FOREIGN KEY (vasarlo_id) REFERENCES vasarlo(id);

-- Törlés:
ALTER TABLE rendeles DROP FOREIGN KEY fk_rendeles_vasarlo;
ALTER TABLE termek   DROP INDEX idx_nev;
ALTER TABLE vasarlo  DROP PRIMARY KEY;

(Vigyázat: a DROP PRIMARY KEY hibát ad, amíg a kulcs oszlopa AUTO_INCREMENT — MySQL-ben az auto-increment oszlopnak kulcsnak kell lennie, ezért előbb MODIFY-jal el kell venni tőle az AUTO_INCREMENT tulajdonságot.)

ℹ️ NEVEZD EL A MEGSZORÍTÁST

Ha idegen kulcsot adsz hozzá, érdemes CONSTRAINT névvel ellátni (pl. fk_rendeles_vasarlo). Így később egyértelműen tudsz rá hivatkozni a DROP FOREIGN KEY-nél.

6Tábla átnevezése

-- Két egyenértékű megoldás:
ALTER TABLE kategoria RENAME TO termekkategoria;
RENAME TABLE kategoria TO termekkategoria;

A RENAME TABLE előnye, hogy egyszerre több táblát is átnevezhetsz, sőt sémák között is mozgathatsz.

7Élő SQL-gyakorló

Próbáld ki az ALTER műveleteket a webshop adatbázison! A séma és a példaadatok be vannak töltve. Módosíts táblákat, majd egy SELECT-tel nézd meg az eredményt.

SQL-gyakorló — ALTER a webshopon

SQL-motor betöltése…
⚠️ A GYAKORLÓ KORLÁTAI — FONTOS

A beépített motor SQLite-alapú, és az SQLite ALTER-támogatása szűkebb a MySQL-énél. Itt működik: ADD COLUMN, RENAME COLUMN, DROP COLUMN, RENAME TO. Itt NEM fut (de éles MySQL-en igen): MODIFY, CHANGE, valamint a megszorítások ALTER-rel való hozzáadása/törlése (ADD UNIQUE, ADD FOREIGN KEY stb.). Ha ilyet próbálsz, a gyakorló külön jelzi. Az éles MySQL-en a fenti, tananyagbeli szintaxis a helyes.

8Feladatok

Gyakorló feladatok

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

5.1⭐

Mit csinál pontosan ez az utasítás? Térj ki az AFTER szerepére is!

ALTER TABLE termek ADD COLUMN vonalkod VARCHAR(20) AFTER nev;
5.2⭐

Hogyan nevezel át egy táblát? Adj meg legalább egy lehetőséget!

5.3⭐

Mivel pozícionálhatod az új oszlopot a tábla elejére, illetve egy adott oszlop mögé?

5.4⭐⭐

Az alábbi utasítás hibát ad egy adatokat tartalmazó táblán. Miért, és hogyan javítanád?

ALTER TABLE termek ADD COLUMN gyarto VARCHAR(100) NOT NULL;
5.5⭐⭐

Hogyan adsz utólag egyedi megszorítást a vasarlo tábla email oszlopára?

5.6⭐⭐⭐

Mi a két különbség az alábbi két utasítás között?

ALTER TABLE termek MODIFY COLUMN leiras VARCHAR(300) NOT NULL;
ALTER TABLE termek CHANGE COLUMN leiras megnevezes VARCHAR(300) NOT NULL;
5.7⭐

Kódírás: adj a termek táblához egy leiras nevű, hosszú szöveges (nem kötelező) oszlopot! Futtasd le a gyakorlóban, és ellenőrizd egy SELECT-tel.

5.8⭐⭐

Kódírás: a rendeles táblához adj egy szallitasi_dij oszlopot (pontos tizedes, nem lehet üres, alapból 0), majd nevezd át a táblát megrendeles-re!

5.9⭐⭐⭐

Kódírás: vegyél fel egy névvel ellátott idegen kulcsot a termek.kategoria_id-ra (a kategoria.id-ra hivatkozva), majd írd le, hogyan törölnéd! (A gyakorló erre MySQL-jelzést ad — éles MySQL-en futtatható.)

9Önellenőrző kvíz

Ellenőrizd magad!

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

10Fogalomtár

FogalomJelentés
ALTER TABLElétező tábla szerkezetének módosítása (DDL)
ADD COLUMNúj oszlop felvétele — NOT NULL esetén DEFAULT-tal
MODIFY COLUMNtípus/megszorítás módosítása, a név marad
CHANGE COLUMNátnevezés + típus egyben (a típus megadása kötelező)
RENAME COLUMNcsak átnevezés, típus nélkül
DROP COLUMNoszlop törlése az adataival együtt — visszavonhatatlan
AFTER / FIRSToszloppozíció az ADD/MODIFY/CHANGE végén — jelölő nélkül a tábla vége (MySQL-specifikus)
ADD CONSTRAINT névnévvel ellátott megszorítás — később név szerint törölhető
RENAME TO / RENAME TABLEtábla átnevezése (utóbbival több tábla egyszerre)
típusszűkítéskisebb kapacitású típusra váltás — csonkolás- és hibaveszély

11Összegzés

  1. Az ALTER TABLE létező tábla szerkezetét módosítja (DDL).
  2. ADD COLUMN — új oszlop (NOT NULL-hoz adj DEFAULT-ot!); pozíció: AFTER / FIRST (jelölő nélkül a tábla végére).
  3. MODIFY (típus), CHANGE (név + típus), RENAME COLUMN (csak név).
  4. DROP COLUMN — oszlop és adatai törlése (visszavonhatatlan).
  5. Megszorítások/indexek utólag: ADD / DROP (idegen kulcsot nevezz el!).
  6. RENAME TO / RENAME TABLE — tábla átnevezése.