6. diel - PostgreSQL - Dátové typy a NULL
V minulej lekcii, PostgreSQL - Export , sme si ukázali rôzne typy exportov databázy.
V minulom dieli seriálu tutoriálov o PostreSQL databáze sme sa dozvedeli niečo o radení ao agregačných funkciách. Dnes sa vrátime k dátovým typom, predstavíme si tabuľky tých najdôležitejších a povieme si niečo o hodnote NULL.
Dátové typy
Hneď na začiatku seriálu sme si uviedli niekoľko základných dátových typov. Vtedy som vám s nimi nechcel motať hlavu. Reč bola o typoch INTEGER, CHARACTER Varying a DATE. Databáza (konkrétne tu PostgreSQL) ich má samozrejme omnoho viac. Uveďme si pár tabuliek a predstavme si tie najdôležitejšie.
Celé čísla
typ | veľkosť | rozsah |
---|---|---|
SMALLINT | 2 byty | -32768 to +32767 |
INTEGER | 4 byty | -2147483648 to +2147483647 |
BIGINT | 8 bytov | -9223372036854775808 to +9223372036854775807 |
Type | veľkosť |
---|---|
CHARACTER (n) | fixné dĺžka |
CHARACTER Varying (n) | variabilná dĺžka s limitom |
TEXT | neobmedzená dĺžka |
Boolean
Na rozdiel napríklad od MySQL ponúka PostgreSQL dátový typ boolean.
typ | veľkosť | hodnoty |
---|---|---|
boolean | 1 byte | true / false |
typ | veľkosť | popis |
---|---|---|
DATE | 4 byty | dátum |
TIMESTAMP | 8 bytov | dátum a čas |
TIMESTAMP WITH TIME ZONE | 8 bytov | dátum a čas s časovou zónou |
Do databázy môžeme uložiť aj dáta ako obrázky alebo iné súbory, aj keď sa to v praxi príliš nerobí.
typ | veľkosť |
---|---|
byte | 1 alebo 4 byty plus veľkosť binárneho reťazca |
Dátové typy v databázach sa málinko odlišujú od dátových typov, ako ich poznáme v programovacích jazykoch. Kým napríklad v céčku môže mať int hodnoty len nejakých -32.000 až +32.000 a nič okrem toho, databázový INT môže nadobúdať aj hodnoty NULL. NULL nemá vôbec nič spoločné s nulou (0), označuje to, že hodnota nebola ešte zadaná. Filozofia databáz je takto postavená, nezadaných hodnoty majú predvolenú hodnotu NULL (ak im nenastavíte inú) a každý dátový typ má okrem hodnôt, ktoré by sme v ňom očakávali, navyše možnú hodnotu NULL. Dátovému typu túto hodnotu môžeme aj zakázať, viac ďalej.
Ak napr. Príkazom INSERT vložíme užívateľa a vyplníme len niektoré hodnoty, do ďalších hodnôt sa vloží NULL. Skúsme si to:
INSERT INTO uzivatel (jmeno, prijmeni) VALUES ('Pan', 'Neuplny');
výsledok:
Užívateľa vyhľadáme takto:
SELECT * FROM uzivatel WHERE datum_narozeni IS NULL OR pocet_clanku IS NULL;
Prínos hodnoty NULL
Asi sa pýtate na čo hodnota NULL vlastne je? Jej prínos je v tom, že spoznáme, či bola hodnota zadaná. Napr. pri zadávaní čísla neexistuje hodnota, podľa ktorej by sme poznali, že číslo nie je zadané. Keby sme si k tomuto určili hodnotu nula (0), nevieme, či používateľ číslo nezadal alebo zadal práve nulu. NULL okrem iného aj šetrí miesto v databáze, kde na rozdiel od pôvodnej hodnoty nezaberá miesto.
NULL na strane aplikácie
Už sme si povedali o tom, že programovacie jazyky hodnotu NULL spravidla nemajú (teda tie staticky typizovanej). V jazykoch ako je potrebné dynamické PHP nemusíme dátový typ vôbec riešiť, aj keď je dobré vedieť, že sa na NULL môžeme spýtať, keď to budeme potrebovať. V jazykoch typovaných, ako je potrebné Java alebo C #, musíme použiť iné dátové typy. VC # môžeme ktorýkoľvek dátový typ označiť ako NULLovatelný a on pochopí, že v ňom môže byť aj NULL. V Jave budeme používať dátové typy s veľkými písmenami, teda napr. Pre čísla miesto int použijeme Integer.
Upresňujúce informácie k dátovým typom
K dátovým typom (ak chcete k stĺpcom) môžeme uviesť niekoľko upresňujúcich informácií.
Názov | popis |
---|---|
UNIQUE | Hovorí, že nesmie existovať viac riadkov, ktoré majú v tejto položke rovnakú hodnotu (s výnimkou hodnoty NULL). Zmysel to má iba u kľúčov. |
NOT NULL | Táto hodnota nesmie byť prázdna - nepôjde do nej vložiť hodnota NULL. |
PRIMARY KEY | Tým sa určí, že sa tento stĺpec (v každej tabuľke max. Jeden) bude používať ako kľúč. Vhodné pre nejaké relatívne krátkej identifikačné kódy, podľa ktorých budeme riadky najčastejšie hľadať. Primárny kľúč je vždy NOT NULL a UNIQUE; aj keď to nenařídíme, dostane tieto vlastnosti implicitne. |
DEFAULT hodnota | Východisková hodnota, ktorú položka dostane, keď ju pri vkladaní riadku neuvedieme. |
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;
vysvetlenie:
DROP TABLE IF EXISTS uzivatel
Zmaže tabuľku uzivatel z databázy. If exists hovorí, že ak takáto tabuľka neexistuje, tak to nevadí. Ak by sme if exists nepoužili a tabuľka uzivatel by neexistovala, skončil by SQL príkaz chybou:
ERROR: table "uzivatel" does not exist ********** Error ********** ERROR: table "uzivatel" does not exist SQL state: 42P01
Popis chyby hovorí, že tabuľka uzívate neexistuje.
CREATE TABLE uzivatel (...)
Vytvorí tabuľku uzivatel tak ako je nadefinované. Stĺpce uzivatel_id, meno, priezvisko a počet_clanku budú nenulové (not null) a stĺpec pocet_clanku bude mať predvolenú hodnotu 0. To znamená, že v prípade, že pri vkladaní dát hodnotu pre tento stĺpec neuvedieme, vloží sa tam nula. U stĺpca uzivatel_id by sme NOT NULL nemuseli uvádzať, pretože tento stĺpec je PRIMARY KEY, kedy je NULL hodnota neprípustná.
INSERT INTO uzivatel ....
Vloží dáta do tabuľky uzivatel.
SELECT * FROM uzivatel;
Získa všetky záznamy z tabuľky uzivatel.
Všimnite si, že užívateľovi Ján Novák sa do stĺpca pocet_clanku vložila defaultný hodnota 0;
Nabudúce si pripravíme tabuľky a testovacie dáta pre jednoduchý redakčný systém, ako je potrebné tu na ITnetwork. Ďalšie diely totiž budeme robiť otázky cez viac tabuliek a tzv. Poddotazy. Tak bude váš arzenál základných databázových nástrojov kompletné pre tvorbu prakticky akejkoľvek aplikácie .