6. díl - PostgreSQL - Datové typy a NULL

PostgreSQL PostgreSQL - Datové typy a NULL

V minulém dílu seriálu tutoriálů o PostreSQL databázi 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 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

Typ Velikost Rozsah
SMALLINT 2 byty -32768 to +32767
INTEGER 4 byty -2147483648 to +2147483647
BIGINT 8 bytů -9223372036854775808 to +922337203685­4775807

Texty

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ů.

Boolean

Na rozdíl například od MySQL nabízí PostgreSQL datový typ boolean.

Typ Velikost Hodnoty
boolean 1 byte true / false

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

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

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. 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. 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ží NULL. Zkusme si to:

INSERT INTO uzivatel (jmeno, prijmeni) VALUES ('Pan', 'Neuplny');

Výsledek:

Hodnota NULL v PostgreSQL

Uživatele vyhledáme takto:

SELECT * FROM uzivatel WHERE datum_narozeni IS NULL OR pocet_clanku IS NULL;
Vyhledávání podle NULL v PostgreSQL

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

Název Popis
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 serial NOT NULL,
        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;

Vysvětlení:

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

********** Error **********

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 počet_clanku budou nenulové (not null) a 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 nula. U sloupce uzivatel_id bychom NOT NULL nemuseli uvádět, protože tento sloupec je PRIMARY KEY, kdy je NULL hodnota nepřípustná.

INSERT INTO uzivatel ....

Vloží data do tabulky uzivatel.

SELECT * FROM uzivatel;

Získá všechny záznamy z tabulky uzivatel.

pgAdmin

Všimněte si, že uživateli Jan Novák se do sloupce pocet_clanku vložila defaultní hodnota 0;

Příště si připravíme tabulky a testovací data pro jednoduchý redakční systém, jako je třeba zde 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 :).


 

  Aktivity (1)

Článek pro vás napsal vita
Avatar
vita

Jak se ti líbí článek?
Celkem (1 hlasů) :
55555


 



 

 

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í!