Lekce 8 - PostgreSQL - Datové typy a NULL
V předešlém cvičení, Řešené úlohy k 7. lekci PostgreSQL, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
V dnešním PostgreSQL tutoriálu 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ů. Řeč byla o typech INTEGER
, CHARACTER VARYING
a DATE
. Databáze (konkrétně zde PostgreSQL) jich má
samozřejmě mnohem více. Uveďme si pár tabulek a představme si ty
nejdůležitější.
Celá čísla
Datové typy pro celá čísla:
Typ | Velikost | Rozsah |
---|---|---|
SMALLINT | 2 byty | -32768 to +32767 |
INTEGER | 4 byty | -2147483648 to +2147483647 |
BIGINT | 8 bytů | -9223372036854775808 to +9223372036854775807 |
Textové řetězce
Datové typy pro textové řetězce:
Type | Velikost |
---|---|
CHARACTER (n) | fixní délka |
CHARACTER VARYING (n) | variabilní délka s limitem |
TEXT | neomezená délka |
V ASCII textech platí uvedené maximální délky přímo pro znaky (1 znak = 1 B). V kódování Unicode je potřeba počítat s tím, že jeden znak může zabrat víc bytů.
Datum a čas
Datový typ pro datum a čas:
Typ | Velikost | Popis |
---|---|---|
DATE | 4 byty | datum |
TIMESTAMP | 8 bytů | datum a čas |
TIMESTAMP WITH TIME ZONE | 8 bytů | datum a čas s časovou zónou |
Boolean
Na rozdíl například od MySQL nabízí PostgreSQL datový typ
BOOLEAN
:
Typ | Velikost | Hodnoty |
---|---|---|
BOOLEAN | 1 byte | true / false |
Binární data
Do databáze můžeme uložit i data jako obrázky nebo jiné soubory, i když se to v praxi příliš nedělá:
Typ | Velikost |
---|---|
BYTEA | 1 nebo 4 byty plus velikost binárního řetězce |
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í:
Název | Popis |
---|---|
IDENTITY | Jen pro čísla. Při vkládání řádku dejte této položce hodnotu
NULL a databáze jí automaticky přidělí hodnotu o 1 větší
než dala minulému řádku (přírůstek se teoreticky dá změnit, ale tím se
nyní nebudeme zatěžovat). Výborná věc pro pohodlnou tvorbu unikátních
identifikačních klíčů. |
UNIQUE | Říká, že nesmí existovat více řádků, které mají v této položce
stejnou hodnotu (s výjimkou hodnoty NULL ). Smysl to má pouze u
klíčů. |
NOT NULL | Tato hodnota nesmí být prázdná - nepůjde do ní vložit hodnota
NULL . |
PRIMARY KEY | Tím se určí, že se tento 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 tyto vlastnosti implicitně. |
DEFAULT hodnota | Výchozí hodnota, kterou položka dostane, když ji při vkládání řádku neuvedeme. |
Nová slova upřesňující datový typ se vkládají za datový typ. Uveďme si nějaký příklad:
DROP TABLE IF EXISTS uzivatel; CREATE TABLE uzivatel ( uzivatel_id integer NOT NULL GENERATED ALWAYS AS IDENTITY, jmeno character varying(60) NOT NULL, prijmeni character varying(60) NOT NULL, datum_narozeni date, pocet_clanku integer NOT NULL DEFAULT 0, PRIMARY KEY (uzivatel_id) ); INSERT INTO uzivatel (jmeno, prijmeni, datum_narozeni) VALUES ('Jan', 'Novák', '1978-03-21'); INSERT INTO uzivatel (jmeno, prijmeni, datum_narozeni, pocet_clanku) VALUES ('Jana', 'Nováková', '1976-11-02', 7); SELECT * FROM uzivatel;
U sloupce uzivatel_id
bychom NOT NULL
nemuseli uvádět, protože tento sloupec je PRIMARY KEY
, kdy je
NULL
hodnota nepřípustná.
DROP TABLE IF EXISTS uzivatel;
smaže tabulku
uzivatel
z databáze. IF EXISTS
říká, že pokud
taková tabulka neexistuje, tak to nevadí. Pokud bychom IF EXISTS
nepoužili a tabulka uzivatel
by neexistovala, skončil by SQL
příkaz chybou:
ERROR: table "uzivatel" does not exist SQL state: 42P01
Popis chyby říká, že tabulka uzivatel
neexistuje.
CREATE TABLE uzivatel (...)
vytvoří tabulku
uzivatel
tak, jak je nadefinovaná. Sloupce
uzivatel_id
, jmeno
, prijmeni
a
pocet_clanku
budou nenulové (NOT NULL
). Sloupec
pocet_clanku
bude mít výchozí hodnotu 0
. To
znamená, že v případě, že při vkládání dat hodnotu pro tento sloupec
neuvedeme, vloží se tam 0
.
INSERT INTO uzivatel ...
vloží data do tabulky
uzivatel
.
SELECT * FROM uzivatel;
získá všechny záznamy z tabulky
uzivatel
:
uzivatel_id | jmeno | prijmeni | datum_narozeni | pocet_clanku |
---|---|---|---|---|
1 | Jan | Novák | 1978-03-21 | 0 |
2 | Jana | Nováková | 1976-11-02 | 7 |
Všimněme si, že uživateli Jan Novák se do sloupce
pocet_clanku
vložila defaultní hodnota 0
.
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.
Datový typ NULL
označuje to, že hodnota nebyla
ještě zadána. 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
. Datovému typu tuto hodnotu můžeme i zakázat, více
dále.
Pokud např. příkazem INSERT
vložíme uživatele a vyplníme
jen některé hodnoty, do dalších hodnot se vloží hodnota
NULL
:
INSERT INTO uzivatel (jmeno, prijmeni) VALUES ('Pan', 'Neuplny');
Výsledek:

Uživatele vyhledáme takto:
SELECT * FROM uzivatel WHERE datum_narozeni IS NULL OR pocet_clanku IS NULL;
Výsledek:
uzivatel_id | jmeno | prijmeni | datum_narozeni | pocet_clanku |
---|---|---|---|---|
32 | Pan | Neuplny | null | null |
Přínos hodnoty NULL
Přínos hodnoty NULL
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, že programovací jazyky hodnotu NULL
zpravidla nemají (tedy ty staticky typované).
V jazycích jako je třeba dynamické PHP datový typ neřešíme.
Na hodnotu NULL
se můžeme zeptat, když to budeme potřebovat.
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 následujícím kvízu, Kvíz - Výběr dat, řazení a datové typy v PostgreSQL, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.