Táblázatok értelmes létrehozása

Az előző előadásokon már egy kicsit megismerkedtünk a táblázatkészítési lekérdezésekkel, most itt az ideje, hogy ebbe is beleássunk.

A táblázat létrehozása nagyon hasonlít egy osztály deklarálásához Java nyelven, és ez a minta:

CREATE TABLE table_name (
	column1 datatype,
	column2 datatype,
	column3 datatype,
   ....
);

Például írjunk egy lekérdezést, amely létrehoz egy táblázatot a felhasználókkal:

CREATE TABLE user (
	id INT,
	name VARCHAR(100),
	level INT,
	created_date DATE,
);

Nagyon egyszerűnek tűnik, mert sok árnyalat nincs itt feltüntetve.

Először is, a táblázat további beállításokat tartalmazhat.

Másodszor, minden oszlopnak lehetnek további beállításai.

És kezdjük az oszlopok létrehozásának beállításaival.

Kulcsok a táblázatban

A néven és az adattípuson kívül egy táblázatoszlop a következő beállításokkal is rendelkezhet:

ELSŐDLEGES KULCS Az oszlop a táblázat kulcsa
EGYEDI KULCS Minden oszlopértéknek egyedinek kell lennie.
Alapértelmezett érték Alapértelmezett érték
NEM NULLA A NULL érték elfogadásának tilalma
AUTO_INCREMENT Az SQL Server automatikusan növeli az értéket, amikor új rekordot adnak a táblához
GENERÁLT Számított mező
TÁROLÁS Hol tároljuk az adatokat: lemezen vagy memóriában
MEGJEGYZÉS Oszlop megjegyzése, pl. cím helyi nyelven

Az alábbiakban ezek közül nézünk meg néhányat.

Először is ez az ELSŐDLEGES KULCS .

Leggyakrabban ez egy külön oszlop az id névvel és az INT típussal. Ez a tábla úgynevezett "főkulcsa", és minden sorában egyedi érték található ehhez a kulcshoz. Elsősorban arra szolgál, hogy más táblák hivatkozhassanak a mi táblánk rekordjaira, és mutassanak az adott rekordra.

A második az EGYEDI KULCS .

Bizonyos szempontból hasonlít a PRIMARY KEY-hez, bár a szemantikai terhelése teljesen más. Ha egy oszlop rendelkezik EGYEDI attribútummal, akkor az oszlopban lévő összes értéknek egyedinek kell lennie. Jó példa az EGYEDI KULCS és az ELSŐDLEGES KULCS közötti különbségre az útlevélhivatalban dolgozók listája.

Az adószám ELSŐDLEGES KULCS, arra szolgál, hogy más táblákból könnyen lehessen hivatkozni a megfelelő személyre.

Az útlevél száma EGYEDI KULCS. Két embernek nem lehet ugyanaz az útlevele. Az útlevél száma azonban megváltoztatható. Például a vezetéknév megváltoztatásakor. Az adószám pedig örökre nálad marad. Ez a PRIMARY KEY fő feladata. Példa egy lekérdezésre, amely megadja az ELSŐDLEGES KULCSOT:

CREATE TABLE user (
	id INT PRIMARY KEY,
	name VARCHAR(100),
	level INT,
	created_date DATE,
);

Adattípus beállítások

Vannak kevésbé fontos, de hasznos tulajdonságok.

ALAPÉRTELMEZETT érték

Adatok beszúrásakor (új sor hozzáadása) egy táblázatba elhagyhatja egyes oszlopok értékeit, ha azok alapértelmezett értékkel rendelkeznek. Ebben az esetben az SQL szerver egyszerűen beállítja magának az oszlopnak az értékét.

A MySQL 8-as verziójától kezdve megadhat egy kifejezést értékként.

NEM NULLA

Ha egy tábla létrehozásakor megadja a NOT NULL attribútumot egy oszlophoz, akkor az SQL Server biztosítja, hogy ne lehessen NULL értéket tárolni ebben az oszlopban. Alapértelmezés szerint bármelyik oszlopnak lehet NULL értéke, még egy INT oszlopnak is. Ami egy Java programozó számára egy kicsit nem nyilvánvaló.

AUTO_INCREMENT

Általában oszlopazonosítókhoz használják. Ha új sort ad egy táblához, akkor valóban azt szeretné, hogy az SQL-kiszolgáló azonosítót rendeljen ehhez a bejegyzéshez. Ki tudja jobban a szervernél, hogy hány sora van a táblázatban. Különösen akkor, ha a kérések különböző kliensektől ugyanahhoz az SQL-kiszolgálóhoz érkeznek.

Pontosan ezt teszi az AUTO_INCREMENT attribútum. Új sor hozzáadásakor egyszerűen nem adunk át semmit azonosítóként, és az SQL szerver megadja a helyes azonosítót ehhez a rekordhoz: egyszerűen felveszi az utolsó létező rekord azonosítóját, és növeli 1-gyel. Ez az attribútum csak egész és valós számtípusokkal használatos. És természetesen vessünk egy példát egy ilyen táblázat létrehozására:

CREATE TABLE user (
	id INT PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(100) NOT NULL,
	level INT DEFAULT 1,
	created_date DATE NOT NULL,
);