03. Adatdefiniáló utasítások - Tábla létrehozása

A relációk létrehozására a CREATE TABLE SQL utasítás szolgál, melynek általános alakja a következő:

CREATE TABLE tábla_név    
  (mező_név adattípus [(szélesség)] [NOT NULL]. 
  (mező_név adattípus [(szélesség)] [NOT NULL]. 
... );

A szélesség megadása el is maradhat. A táblák és általában a nevek megadására a következő szabályok érvényesek:

  • a névben csak az angol ABC betűi, a számjegyek és az _, #, $ karakterek szerepelhetnek
  • a névnek betűvel kell kezdődnie
  • a neveknek hatáskörükön belül egyedinek kell lennie (például nem lehet egy adatbázisban két azonos nevű tábla, egy táblában két azonos nevű mező, stb.)

A nevek hossza korlátozott. Az SQL az azonosítókban és a parancsszavakban általában nem tesz különbséget a kis és nagybetűk között.

A mező típusát megadva, a tábla azon oszlopába más típusú adat nem vihető be, erről az adatbáziskezelő gondoskodik illetve szükség esetén figyelmeztet. A NOT NULL a mező definiciójában arra utal, hogy az adat megadása kötelező, azaz nem lehet olyan sor a táblában, ahol az adat nincs kitöltve.

A minta adatbázisban található táblák létrehozása a következő utasításokkal történhet:

CREATE TABLE Diakok(
  DID INTEGER (11) NOT NULL,   
  Nev VARCHAR (30) NOT NULL,      
  Cim VARCHAR (40) NOT NULL,      
  Telefon VARCHAR (15)      
  Osztaly VARCHAR (3) NOT NULL
);
 
CREATE TABLE Tanarok (
  TID INTEGER (11) NOT NULL,  
  Nev VARCHAR(30) NOT NULL,     
  Cim VARCHAR(40) NOT NULL,     
  Telefon VARCHAR(15)
);
 
CREATE TABLE Orarend(
  TID INTEGER (11) NOT NULL,  
  Tantargy VARCHAR(20) NOT NULL,
  Idopont NUMERIC(2), NOT NULL,    
  Osztaly VARCHAR(3) NOT NULL),
  Terem   INTEGER NOT NULL
);
 
CREATE TABLE Osztalyzatok(
  DID INTEGER (11) NOT NULL,   
  Tantargy VARCHAR (20) NOT NULL,
  Datum DATE NOT NULL,   
  Osztalyzat INTEGER NOT NULL
);
 
CREATE TABLE Hianyzasok(
  DID INTEGER (11) NOT NULL,   
  Datumtol DATE NOT NULL,     
  Datumig DATE,    
  Igazolt VARCHAR(1)
);

A CREATE TABLE utasítással létrehozott táblázatok definicióját csak korlátozottan módosíthatjuk, újabb mezőt adhatunk a táblához vagy egy mező szélességét megnövelhetjük. Egy mező szélességének csökkentésére illetve törlésére nincs közvetlen mód. Ez csak úgy érhető el, hogy a módosításoknak megfelelő ürestáblát hozunk létre, amibe a szükséges adatokat átmásoljuk, majd az eredeti táblát töröljük.

A fent létrehozott adatbbázis szerkezete és a táblák közötti kapcsolat körülbelül így néz ki:

https://www.fzolee.hu/fw/files/node/1482/iskola.jpg

Megjegyzés:

A fenti módosítási korlátoknak az az értelme, hogyha egy meglévő adatbázisba már felvettünk sok adatot - több millió rekordot akár, akkor a táblák szerkezetének módosítása a több millió rekordot tároló adatfájlok fizikai átrendezését is befolyásolja, így a módosítás rengeteg processzor időt, sok háttértárat és egyéb sok erőforrást foglaló műveleteket eredményezhet. A táblák szerkezetét ezért éles környezetben ne nagyon változtassuk!

Ha csökkentjük egy mező méretét, akkor adatvesztés jöhet létre, hiszen lehet olyan érték (pl. hosszú szöveg), ami már az új méretbe nem fér bele. Ha egy mezőt kiveszünk a táblából, akkor pedig lehetséges, hogy egy komplex adatbázis rendszerben hibát okozunk, mert más táblák egyes mezői hivatkozhatnak az ebben a táblából kivett mező adataira.