Lekce 8 - Oracle krok za krokem: Datové typy a NULL
V předešlém cvičení, Řešené úlohy k 7. lekci Oracle, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
Dnes se vrátíme k datovým typům, představíme si tabulky těch
nejdůležitějších a řekneme si něco o hodnotě NULL
.
Datové typy
Hned na začátku seriálu jsme si uvedli několik základních datových
typů. Tehdy jsem vám s nimi nechtěl motat hlavu. Řeč byla o typech
INT
, VARCHAR
a DATE
. Databáze
(konkrétně zde Oracle) jich má samozřejmě mnohem více. Uveďme si pár
tabulek a představme si ty nejdůležitější. Následující tabulky
obsahují ty nejpoužívanější datové typy.
Celá čísla
Oracle (na rozdíl např. od MySQL) nevyužívá
celočíselné datové typy jako TINYINT
, MEDIUMINT
a
BIGINT
. Z klasických celočíselných datových typů je zde pouze
SMALLINT
a INT
. Ostatní celočíselné datové typy
nám nahrazuje datový typ NUMBER
, za který se poté do závorek
udává velikost (rozsah):
Typ (MySQL) | Typ (Oracle) | Rozsah |
---|---|---|
TINYINT | NUMBER(3) | 8b |
SMALLINT | SMALLINT nebo NUMBER(5) | 16b |
MEDIUMINT | NUMBER(7) | 24b |
INT | INT nebo NUMBER(10) | 32b |
BIGINT | NUMBER(19) | 64b |
Pozn. pokud hledáte datový typ boolean (hodnoty
TRUE
/FALSE
), tak k ukládání této hodnoty se
zpravidla používá NUMBER(1,0)
.
Texty
Typ | Rozsah |
---|---|
VARCHAR2 (max. počet znaků) | počet znaků jaký si zvolíte, max. 32kB |
CHAR (počet znaků) | pevný počet znaků jaký si zvolíte, max. 2kB |
CLOB | až 8 terabytů |
NVARCHAR2 (max. počet znaků) | stejný jako VARCHAR2, pouze pro Unicode znaky |
NCHAR (počet znaků) | stejný jako CHAR, pouze pro znaky Unicode |
NCLOB | stejný jako CLOB, pouze pro znaky Unicode |
Ostatní
Typ | Rozsah |
---|---|
DATE | Datum jako textový řetězec ve tvaru 'dd.mm.rr', rozsah od '1.1.4712' př.n.l. do '31.12.4712' n.l. |
TIMESTAMP | Datum i s konkrétním časem ve tvaru 'dd.mm.rr hh:mm:ss,ms' |
INTERVAL | Časový interval mezi dvěma datumy |
BLOB atd. | Obecná data v binárním tvaru. Umožňují do databáze ukládat např. obrázky nebo zvuky. |
Hodnota NULL
Datové typy v databázích se malinko odlišují od datových typů jak je
známe v programovacích jazycích. Zatímco třeba v céčku může mít INT
hodnoty jen nějakých
-32.000
až +32.000
a nic kromě toho. Databázový
INT
může nabývat i hodnoty NULL
. NULL
nemá vůbec nic společného s nulou (0), označuje to, že hodnota
nebyla ještě zadána. Dá se říci, že to je prázdná hodnota.
Filozofie databází je takto postavena, nezadané hodnoty mají výchozí
hodnotu NULL
(pokud jim nenastavíme jinou) a každý datový typ
má kromě hodnot, které bychom v něm očekávali, navíc možnou hodnotu
NULL
.
Každému sloupci v tabulce můžeme také již při tvorbě tabulky
explicitně zakázat hodnotu NULL. Uděláme to přidáním slov
NOT NULL
za datový typ sloupce:
CREATE TABLE knihy ( knihy_ID INT PRIMARY KEY, nazev VARCHAR2(50) NOT NULL, autor VARCHAR2(50) );
Vidíme, že u primárního klíče NOT NULL
přidávat
nemusíme, ten totiž NULL
nikdy být nemůže. U sloupce
nazev
jsme hodnotu NULL
explicitně zakázali, a u
sloupce autor
nechali povolenou.
Můžeme to nyní otestovat. Zkusme si spustit následující dotaz:
INSERT INTO knihy(knihy_ID, nazev) VALUES (1, 'Střet Králů')
Vše proběhlo v pořádku. Při vložení záznamu jsme zde vynechali
sloupec autor
, to ale nevadí, protože ten hodnotu NULL obsahovat
může. Zkusme si nyní dotaz trochu upravit:
INSERT INTO knihy(knihy_ID, autor) VALUES (2, 'George R.R. Martin')
Výsledek:
Error starting at line : 1 in command - INSERT INTO knihy(knihy_ID, autor) VALUES (2, 'George R.R. Martin') Error report - ORA-01400: do ("NOVESCHEMA"."KNIHY"."NAZEV") nelze vložit hodnotu NULL
Z čehož již vidíme, že do sloupce nazev
hodnotu NULL
vložit nemůžeme.
Přínos hodnoty NULL
Asi se ptáte k čemu hodnota NULL
vlastně je? Její přínos
je v tom, že poznáme, jestli byla hodnota zadána. Např. při zadávání
čísla neexistuje hodnota, podle které bychom poznali, že číslo není
zadáno. Kdybychom si k tomuto určili hodnotu nula (0), nevíme, jestli
uživatel číslo nezadal nebo zadal právě nulu. NULL
mimo jiné
i šetří místo v databázi, kde na rozdíl od výchozích hodnot nezabírá
místo.
NULL
na straně aplikace
Již jsme si řekli o tom, že programovací jazyky hodnotu NULL
zpravidla nemají (tedy ty staticky typované). V jazycích jako je třeba
dynamické PHP nemusíme datový typ vůbec řešit, i když je dobré vědět,
že se na NULL
můžeme zeptat, když to budeme potřebovat.
Můžeme sice v nových verzích PHP určit datový typ, ale
není to podmínkou. V jazycích typovaných, jako je třeba Java nebo C#, musíme použít jiné
datové typy. V C# můžeme kterýkoli datový typ označit jako NULLovatelný a
on pochopí, že v něm může být i NULL
. V Javě budeme
používat obalovací datové typy s velkými písmeny, tedy např. pro čísla
místo int
použijeme Integer
.
Upřesňující informace k datovým typům
K datovým typům (chcete-li ke sloupcům) můžeme uvést několik
upřesňujících informací. Již jsme se setkali s PRIMARY KEY
.
Podívejme se na další.
Název | Popis |
---|---|
GENERATED ALWAYS AS IDENTITY (START WITH n INCREMENT BY m) | Pro automatické navyšování ID. Při vkládání řádku tuto položku
vynechejte, a systém jí automaticky přidělí hodnotu o
m větší než dal minulému řádku, přičemž začátek zde
bude číslo n . |
UNIQUE | Říká, že nesmí existovat víc řádků, které mají v této položce
stejnou hodnotu (s výjimkou hodnoty NULL ). Smysl to má pouze u
klíčů. |
NOT NULL | Tahle hodnota nesmí být prázdná - nepůjde do ní vložit hodnota
NULL . |
PRIMARY KEY | Tím se určí, že se tenhle sloupec (v každé tabulce max. jeden) bude
používat jako klíč. Vhodné pro nějaké relativně krátké identifikační
kódy, podle kterých budeme řádky nejčastěji hledat. Primární klíč je
vždy NOT NULL a UNIQUE ; i když to nenařídíme,
dostane tyhle vlastnosti implicitně. |
DEFAULT hodnota | Výchozí hodnota, kterou položka dostane, když ji při vkládání
řádku neuvedeme. Nefunguje na binární datové typy a položky s
GENERATED . |
V následujícím kvízu, Kvíz - Výběr dat, řazení a datové typy v Oracle, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.