IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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 +922337203685­4775807

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:

Hodnota NULL v PostgreSQL - PostgreSQL databáze krok za krokem

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 NULLje 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í.


 

Předchozí článek
Řešené úlohy k 7. lekci PostgreSQL
Všechny články v sekci
PostgreSQL databáze krok za krokem
Přeskočit článek
(nedoporučujeme)
Kvíz - Výběr dat, řazení a datové typy v PostgreSQL
Článek pro vás napsal vita
Avatar
Uživatelské hodnocení:
50 hlasů
vita
Aktivity