Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 30% výuky zdarma!
Pouze tento týden sleva až 80 % na e-learning týkající se PHP
Discount week - April - 30

Lekce 8 - Oracle krok za krokem: Datové typy a NULL Nové

V minulé lekci, Oracle krok za krokem: Řazení, Fetch a agregační funkce, jsme se dozvěděli něco o řazení a o agregačních funkcích.

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

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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+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 dejte této položce hodnotu NULL 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 příští lekci, Oracle krok za krokem: Dotazy přes více tabulek (JOIN), si připravíme tabulky a testovací data pro jednoduchý redakční systém, jako je třeba tady na ITnetwork. Další díly totiž budeme dělat dotazy přes více tabulek a tzv. poddotazy. Tak bude váš arzenál základních databázových nástrojů kompletní pro tvorbu prakticky jakékoli aplikace :)


 

Předchozí článek
Oracle krok za krokem: Řazení, Fetch a agregační funkce
Všechny články v sekci
Oracle
Článek pro vás napsal Matěj Kadlec
Avatar
Jak se ti líbí článek?
1 hlasů
Autor se programování věnuje od střední školy, nyní studuje informatiku na VŠB-TUO. Mezi jeho oblíbené jazyky patří Python, C# a SQL.
Aktivity (2)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!