Adatbázis-kezelés · SQL › Adatbázis és táblák létrehozása MariaDB-ben

10–11. osztály · MariaDB / phpMyAdmin

Adatbázis és táblák létrehozása MariaDB-ben

Két összekapcsolt táblát készítesz egy kitalált munkahely számára. Kipróbálod, hogyan védik az adatokat a kulcsok és az ellenőrző feltételek.

  • Adatbázis-kezelés · SQL
  • Saját feladat
  • Önellenőrzés
Adatkapcsolatokat és digitális adatbázist jelképező illusztráció.

A lecke végére

  • létrehozol egy adatbázist és két táblát
  • megkülönbözteted a NOT NULL, DEFAULT, CHECK és FOREIGN KEY szerepét
  • helyes és hibás próbaadattal is ellenőrzöl

Amit már tudsz

  • fut a MariaDB és megnyílik a phpMyAdmin
  • ismered az elsődleges és idegen kulcsot

Készíts külön gyakorlóadatbázist

Nyisd meg a helyi phpMyAdmint. Az Új ponttal és a név megadásával készíthetsz adatbázist; az alábbi SQL ugyanezt is tartalmazza. A nyelvi felület és az adatbázis illesztési sorrendje két külön beállítás. Az utf8mb4 karakterkészletet, az utf8mb4_hungarian_ci összehasonlítási szabályokat jelöl.

Új adatbázis létrehozására szolgáló mezők a phpMyAdminban.
Az adatbázis neve és illesztési sorrendje itt állítható be. A képernyő régebbi phpMyAdmin-változatot mutat.

Hozd létre a két táblát

Az adatbázis SQL lapján futtasd a kódot egy üres gyakorlókörnyezetben. Az osztályok táblája kerül előre, mert a dolgozók arra hivatkoznak. A példában a dolgozókód kitalált nyolckarakteres azonosító; személyi okmányazonosítót ne használj.

CREATE DATABASE IF NOT EXISTS alkalmazott_gyakorlas  CHARACTER SET utf8mb4 COLLATE utf8mb4_hungarian_ci;USE alkalmazott_gyakorlas; CREATE TABLE osztaly (  oid INT NOT NULL AUTO_INCREMENT,  onev VARCHAR(20) NOT NULL,  PRIMARY KEY (oid)) ENGINE=InnoDB; CREATE TABLE dolgozo (  dolgozokod CHAR(8) NOT NULL,  nev VARCHAR(40) NOT NULL,  fizetes DECIMAL(12,2) NOT NULL CHECK (fizetes >= 150000),  szuldat DATE,  nem CHAR(1) CHECK (nem IN ('F', 'N')),  irsz CHAR(4) NOT NULL DEFAULT '8200'    CHECK (irsz REGEXP '^[1-9][0-9]{3}$'),  varos VARCHAR(30) NOT NULL DEFAULT 'Veszprém',  utca_hsz VARCHAR(50),  oid INT NOT NULL,  PRIMARY KEY (dolgozokod),  FOREIGN KEY (oid) REFERENCES osztaly(oid)) ENGINE=InnoDB;

A példa korszerű MariaDB-hez készült. A CHECK feltételek érvényesítése régi kiszolgálóknál eltérhet; a következő próba ezt is ellenőrzi. Az adatbázis létezésének vizsgálata nem védi a táblákat: már létező táblák esetén a CREATE TABLE hibát jelez, nem írja felül az adatokat.

Értsd meg a megkötéseket

SQL-megkötések
MegadásMit biztosít?
PRIMARY KEYegyedi, nem NULL azonosító
NOT NULLaz érték nem lehet NULL; az üres szöveget önmagában nem tiltja
DEFAULTkihagyott érték helyett alapérték
CHECKa megadott logikai feltételt vizsgálja
FOREIGN KEYlétező osztályra hivatkozás
ENGINE=InnoDBtranzakcióképes tárolómotor, idegenkulcs-támogatással

A CHECK nem helyettesíti a NOT NULL megadást. A nem mező ebben a mintában kihagyható; megadott értéke F vagy N lehet. Az irányítószám szöveg, mert azonosító jellegű; a négy számjegy formai ellenőrzése nem bizonyítja, hogy létező irányítószámról van szó.

A CHAR és VARCHAR karakterhosszt ír le; a tényleges tárigény a karakterkészlettől és a tárolómotortól is függ. A pénzösszeghez a pontos DECIMAL típus illik.

Vigyél be adatot és tesztelj

Előbb az osztályt, majd a dolgozót rögzítsd. A LAST_INSERT_ID() a most létrejött osztály azonosítóját adja, így nem kell feltételeznünk, hogy az 1 lesz.

USE alkalmazott_gyakorlas; INSERT INTO osztaly (onev) VALUES ('Fejlesztes');SET @osztaly_id = LAST_INSERT_ID();INSERT INTO dolgozo (dolgozokod, nev, fizetes, oid)VALUES ('D0000001', 'Proba dolgozo', 200000, @osztaly_id); SELECT d.dolgozokod, d.nev, d.fizetes, o.onevFROM dolgozo AS dJOIN osztaly AS o ON d.oid = o.oid;

Két szándékosan hibás beszúrás

Külön-külön futtasd az alábbi utasításokat. Mindkettőnek hibát kell jeleznie; az egyik az alacsony fizetést, a másik a hiányzó szülőrekordot próbálja bevinni.

INSERT INTO dolgozo (dolgozokod, nev, fizetes, oid)VALUES ('D0000002', 'Proba ketto', 100000, @osztaly_id); INSERT INTO dolgozo (dolgozokod, nev, fizetes, oid)VALUES ('D0000003', 'Proba harom', 200000, -1);
Előbb próbáld meg, utána ellenőrizd

Az elsőt a CHECK, a másodikat a FOREIGN KEY feltétel utasítja el. A sikeres mintából egy dolgozó látható a csatolt osztálynévvel. A két hibás utasítást ne egyetlen tömbként értékeld: az első hiba után a felület leállíthatja a további futtatást.

Ellenőrizd a munkádat

Nézd át az adatbázisodat a phpMyAdminban, és válaszolj a kérdésekre.

  • Az alkalmazott_gyakorlas adatbázis utf8mb4_hungarian_ci illesztéssel jött létre?
  • Előbb az osztaly, utána a dolgozo tábla készült el?
  • A helyes beszúrás után a JOIN-os lekérdezés egy sort adott az osztály nevével?
  • Mindkét szándékosan hibás beszúrás hibát jelzett, és meg tudod mondani, melyik megkötés miatt?
  • A SHOW CREATE TABLE dolgozo; eredményében látod a CHECK és a FOREIGN KEY sort?
Továbbgondolás: mi történik, ha törölni próbálod az osztályt?

Futtasd: DELETE FROM osztaly WHERE oid = @osztaly_id;. Az adatbázis elutasítja a törlést, mert egy dolgozó még erre az osztályra hivatkozik: a hivatkozási épség (FOREIGN KEY) így véd az „árva” rekordoktól. Előbb a hivatkozó dolgozót kell törölni vagy másik osztályba áthelyezni. (Haladó lehetőség: az ON DELETE CASCADE beállítás a szülővel együtt a gyerekrekordokat is törli; ezt csak tudatosan szabad használni.)

Gyakori hiba

Ha az egész kódot másodszor is lefuttatod, a CREATE TABLE hibát jelez, mert a tábla már létezik. Ez nem baj: a meglévő adatok megmaradnak. Gyakorlóadatbázisnál újrakezdéshez előbb a dolgozo, aztán az osztaly táblát töröld (DROP TABLE), a hivatkozás miatt ebben a sorrendben.

Az elméleti háttér a relációs adatmodell leckében van; a környezet beállítását a XAMPP telepítése mutatja be.

Források és továbbolvasás