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

6. diel - SQLite - Dátové typy, NULL a dynamické typovanie

V predchádzajúcom cvičení, Riešené úlohy k 1.-4. lekciu SQLite, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V minulom dieli seriálu tutoriálov o SQLite databáze sme sa dozvedeli niečo o radení ao agregačných funkciách. Dnes sa vrátime k dátovým typom a povieme si niečo o hodnote NULL.

Dátové typy

Hneď na začiatku seriálu sme sa stretli s niekoľkými dátovými typmi. Vtedy som vám s nimi nechcel motať hlavu. Reč bola o typoch INTEGER a TEXT. Databáza (konkrétne tu SQLite) ich má síce ešte niekoľko, ale na rozdiel od iných SQL databáz ich je pomerne málo.

Celé číslo - INTEGER

Podľa veľkosti samotného čísla, ktoré sa ukladá, sa použije 1, 2, 3, 4, 5, 6, 7 alebo 8 bajtov.

Ak hľadáte dátový typ boolean (hodnoty true / false), tak na ukladanie tejto hodnoty sa používa tiež INTEGER - 0 = false, 1 = true.

Reálne číslo - REAL

Na ukladanie reálnych čísel sa používa 64 bitov, presnosť je zhruba 15 až 16 čísel a číslo môže nadobúdať hodnoty + -5.0 * 10 ^ -324 až + -1.7 * 10 308.

Text

Dátový typ TEXT sa používa na ukladanie reťazca znakov podľa použitého kódovania databázy (UTF-8, UTF-16BE or UTF-16-ročné).

Používa sa taktiež na ukladanie času vo formáte 'rrrr-mm-dd hh: mm: ss.sss', ale ide použiť aj dátový typ INTEGER vo formáte Unix - počet sekúnd od 1. januára 1970 0:00, alebo typ REAL.

Blob

Všeobecná dáta v binárnom tvare, použitie analogické k typom TEXT. Umožňujú do databázy ukladať napr. Obrázky alebo zvuky.

Hodnota NULL

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éčko môže mať int hodnoty len nejakých -32.000 až +32.000 a nič okrem toho, databázový INTEGER 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 "uzivatele" ("jmeno", "prijmeni"`) VALUES ('Pan', 'Neuplny');

výsledok:

Vloženie užívateľov s nezadanými hodnotami do SQLite databázy - SQLite databázy krok za krokom

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 narozdiel 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í. Už sme sa stretli s AUTO_INCREMENT. Pozrime sa na ďalšie.

Názov popis
AUTOINCREMENT: Pri vkladaní riadku dajte tejto položke hodnotu NULL a systém jej automaticky pridelí hodnotu o 1 väčšia ako dal minulému riadku (prírastok sa teoreticky dá zmeniť, ale tým sa teraz nebudeme zaťažovať). Výborná vec pre pohodlnú tvorbu unikátnych identifikačných kľúčov.
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 Tahle 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 tyhle vlastnosti implicitne.
DEFAULT hodnota Východisková hodnota, ktorú položka dostane, keď ju pri vkladaní riadku neuvedieme. Nefunguje na Texty, BLOB a položky s AUTO_INCREMENT.
Nové slová upresňujúce dátový typ sa vkladajú za neho, rovnako ako tomu bolo u AUTO_INCREMENT. Uveďme si nejaký príklad:
CREATE TABLE "uzivatele" (
        "uzivatele_id" INTEGER PRIMARY KEY AUTOINCREMENT,
        "jmeno" TEXT NOT NULL,
);

Dynamické typovanie

Prevažná väčšina SQL databáz používa na ukladanie statické typovanie, pri vytvorení tabuľky zadáte dátový typ, ktorý má daný stĺpec obsahovať, a dátový typ položky sa určuje iba podľa toho. SQLite naopak používa dynamické typovanie, kedy sa určuje dátový typ podľa samotnej položky (hodnoty), ktorú tam nahrávate. Poďme si to vyskúšať.

Pripomeniem vám štruktúru našej tabuľky užívateľov

CREATE TABLE "uzivatele" (
        "uzivatele_id" INTEGER PRIMARY KEY AUTOINCREMENT,
        "jmeno" TEXT,
        "prijmeni" TEXT,
        "datum_narozeni" TEXT,
        "pocet_clanku" INTEGER
);

Logicky by nemal ísť uložiť do stĺpca počtu článkov nejaký text, takže si skúsime vložiť takýto záznam:

INSERT INTO "uzivatele" ("pocet_clanku") VALUES ('Mnoho');

Avšak výsledok vďaka dynamickému typovanie je takýto:

Vloženie užívateľov s textom namiesto čísla do SQLite databázy - SQLite databázy krok za krokom
Až na stĺpec s parametrami INTEGER PRIMARY KEY môžete ukladať čo chcete kamkoľvek. Možno vás teraz napadá, či sme nemohli definovať tabuľku nasledovne:
CREATE TABLE "uzivatele" (
        "uzivatele_id" INTEGER PRIMARY KEY AUTOINCREMENT,
        "jmeno",
        "prijmeni",
        "datum_narozeni",
        "pocet_clanku"
);

Áno mohli, je to úplne validný SQL príkaz v SQLite, avšak odporúčam vám, aby ste dátové typy definovali a dodržiavali, potom viete, v akom formáte tam ukladať dáta a v akom ich očakávať potrebné vo svojej aplikácii. Na tento typ sa tiež SQLite pokúsi previesť dáta, takže ak ste stĺpec označili ako INTEGER a vložíte doň '15 .0 ', uloží sa číslo 15.

Kompatibilita s ostatnými databázami

V rámci kompatibility s ostatnými SQL databázami mení SQLite podobné dátové typy ostatných databáz na svoje vlastné. Naša tabuľka užívateľov by sa vytvorila v SQLite takto:

CREATE TABLE `uzivatele` (
  `uzivatele_id` int AUTO_INCREMENT,
  `jmeno` varchar(60),
  `prijmeni` varchar(60),
  `datum_narozeni` date,
  `pocet_clanku` int,
  PRIMARY KEY (`uzivatele_id`)
);

Ak by sme tento kód rozbehli na SQLite, tak by bol prekvapivo úspešne vykonaný, a bol by chápaný rovnako, ako keby sme zadali tento kód:

CREATE TABLE "uzivatele" (
        "uzivatele_id" INTEGER PRIMARY KEY AUTOINCREMENT,
        "jmeno" TEXT,
        "prijmeni" TEXT,
        "datum_narozeni" TEXT,
        "pocet_clanku" INTEGER
);

Tahle vlastnosť vám veľa uľahčí prácu, keď prechádzate z inej databázy na SQLite a chcete si preniesť aj dáta.

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 :)


 

Predchádzajúci článok
Riešené úlohy k 1.-4. lekciu SQLite
Všetky články v sekcii
SQLite databázy krok za krokom
Preskočiť článok
(neodporúčame)
SQLite - Otázky cez viac tabuliek (JOIN)
Článok pre vás napísal Michal Martinek
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Aktivity