8.06. Adatmanipulációs nyelv - Új sor beszúrása, módosítása, törlése

Default book

INSERT - Új sorok beszúrása

Az SQL adatmanipulációs része biztosítja a táblák feltöltését, az mezők módosítását és a sorok törlését. A táblak feltöltésére az INSERT SQL parancs szolgál, melynek általános alakja a következő:

INSERT INTO táblanév [(mezőnév_1, mezőnév_2,  ...)]
VALUES (érték, érték, ...);

Aaz alábbi szabályokra figyelni kell

  • Egy utasítás segítségével egy sor adható meg az adott táblahoz.
  • Az mezőnevek megadása csak akkor kötelező, ha nem minden mezőhoz rendelünk értéket, vagy az mezők értékét nem a definiálás sorrendjében adjuk meg.
  • A NOT NULL megjelöléssel definiált mezők megadása kötelező az INSERT parancsnál, ellenkező esetben hibaüzenetet kapunk.
  • A mezők és a VALUES után álló értékek sorrendjének és típusának meg kell felelnie egymásnak.
  • A definiálatlan értékekre a NULL érték is beállítható, mely numerikus értékekre sem azonos a nullával.

Adjunk egy új sort a Diákok táblahoz

INSERT INTO Diakok (DID, Nev, Cim, Osztaly
VALUES (435, 'Nagy Istvan', 'Budapest O utca 3.', '3.b');
  • Ha egy mező értékét nem adjuk meg, akkor az értéke NULL lesz.. A tábla létrehozásánál NOT NULL jelzéssel ellátott mezőket kötelező minden újabb sor megadásánál kitölteni, mert különben hibaüzenetet kapunk.
  • Ha egy AUTO_INCREMENT (Access: Automatikusan növekvő) tulajdonságú mező értékét az utasításban explicit módon megaduk, akkor hibát fogunk kapni, hiszen az adatbázis-kezelő fog a letárolt addigi értékek alapján új értéket adni a mezőnek. Ezt olyan módon teszi, hogy letárolja az addigi értékeket és az új sor beszúrásakor az utolsó értékhez hozzáad egyet és ez lesz az új érték.

De bevihetjük az előző adatokat az alábbi formában is:

INSERT INTO Diakok
VALUES (436, 'Kiss Pista', 'Budapest Nagyó utca 4.', NULL, '3.b');

Az INSERT utasítás lehetőséget biztosít arra is, hogy a táblat egy másik táblaból átvett értékekkel töltsük fel. Ekkor az értékek megadása helyén egy lekérdező utasítás állhat. A lekérdezés eredményei kerülnek be a megadott táblaba, egyszerre akár több sor is. Itt is igaz, hogy a lekérdezés eredmény táblajának mezői sorrendjének és típusának meg kell felelnie a feltöltendő tábla definiciójának.

INSERT INTO tábla_név [(mező_név, mező_név, ...)] 
lekérdező_utasítás;

A lekérdező utasítások formájával a következő részekben foglalkozunk, de már itt is bemutatunk egy példát. Töltsük át a diákok adatai közül a 3/a osztályba járókét egy külön táblaba:

INSERT INTO 3a
SELECT * FROM diakok WHERE osztaly = '3/a';

A 3a táblat természetesen először létre kell hozni a diákok táblaval egyező szerkezettel, hogy a fenti parancs működjön. A diákok tábla tartalma nem változik.

UPDATE - A mezők tartalmának módosítása

A táblakban szereplő mezők tartalmát az UPDATE utasítással módosíthatjuk.

UPDATE tábla_név     
SET mezőnév = érték, mezőnév = érték, ...   
[WHERE feltétel];
  • Az UPDATE utasítás segítségével egyidőben a táblak több sorát is módosíthatjuk.
  • A SET után adhatjuk meg a módosítandó mezőt és értékeit.
  • A WHERE után egy feltétel adható meg, az utasítás csak a tábla azon sorain dolgozik, melyekre a feltétel értéke igaz.
  • A WHERE rész el is maradhat, ekkor a tábla összes sorára vonatkozik az UPDATE parancs.

A feltételek alakjára részletesen a lekérdező nyelv ismertetésénél térünk ki, de a szokásos összehasonlító operátorok itt is használhatók. Például az Osztályzatok táblában az összes osztályzatot egyesre (vagy ötösre?) állíthatjuk egy UPDATE paranccsal:

UPDATE Osztalyzatok SET Osztalyzat = 1;

Az egyenlőség jobb oldalán a tábla mezőiból álló kifejezés is állhat. Ilyenkor az aktuális sor tartalma alapján értékelődik ki a kifejezés. Az értékek módosítása esetén a feltételben egy lekérdező utasítás is szerepelhet, melynek segítségével egy másik táblából vett értékeket használhatunk.

UPDATE tábla   
SET mező = (lekérdező utasítás)   
[WHERE feltétel];

Sorok törlése

A táblak sorait törölhetjük a DELETE parancs segítségével.

DELETE FROM tábla_név
[WHERE feltétel];

A feltételben az UPDATE parancshoz hasonlóan egy zárójelek közé tett lekérdező utasítás is megadható. Töröljük ki a Diákok közül a 1234 azonosítójút.

DELETE FROM Diakok WHERE Diak_azonosito = 1234;

A kérdés csak az, hogy megtehetjük-e ezt az adatbázis konzisztenciájának (= Megfelelő adatok és hivatkozások) elvesztése nélkül? Ha az Orarend vagy a Hianyzasok táblaban szerepel a törölt diák azonosítója, akkor ezek ellentmondásossá teszik az adatbázisunkat. Helyesebb az alábbi három törlő parancsot kiadni, ha semmi szin alatt sem szeretnénk elveszteni az adatbázis ellentmondás mentességét.

DELETE FROM Hianyzasok WHERE DID = 1234; 
DELETE FROM Osztalyzatok WHERE DID = 1234;     
DELETE FROM Diakok WHERE DID = 1234;

Ha nem használjuk a WHERE alparancsot, akkor a tábla összes sora törlődik(!!!!). Tételezzük fel, hogy az iskolából kicsapott diákok nevét egy kicsapottak táblában őrizzük a kics oszlopban. Ennek alapján a diákok táblaból a következő paranccsal törölhetjük őket:

DELETE FROM Diakok WHERE nev IN (SELECT kics FROM kicsapottak);