K tomu, aby jste určili, jaká data budete do sloupců ukládat, slouží datové typy. Datový typ určuje jednak jaký typ dat budete ukládat (text, celé číslo, číslo s desetinou čárkou) a také kolik bytů bude zabírat. (Například typ integer je celé číslo 4byty dlouhé, jeho rozsah je -2 až 2 biliony, smalint je celé číslo 2byty dlouhé, jeho rozsah je -32 až 32 tisíc, atd.).
V následující tabulce vidíte nejpoužívanější datové typy. Pokud vás zajímají další, použijte metapříkaz \dT.
| Typ | Význam | Popis |
|---|---|---|
| bool | "Logická hodnota" | Může nabývat pouze dvou hodnot: true (pravda) a
false (nepravda). Za true se též považuje každá nenulová hodnota, za false naopak nulová hodnota. |
| char(n) | "Znakový řetězec" | Délka řetězce je n znaků. Zadáte-li kratší řetězec, bude
doplněn z prava mezerami. Za n se dosazuje číslo. Všechny typy znakových řetězců se uvozují jednoduchými 'uvozovkami'. |
| varchar(n) | "Znakový řetězec" | Délka řetězce může být maximálně n znaků. Zůstává v dané délce (nedoplňuje se mezerami), varchar obsahuje informaci o délce řetězce. |
| text | "Znakový řetězec" | Řetězec neomezené délky. Pokud nemusíte, nepoužívejte. Značně zpomaluje práci s databází. |
| integer | "Celé číslo" | Číslo bez desetinné čárky. Přípustné hodnoty jsou od -2 do 2 biliónů. |
| float | "Reálné číslo" | Číslo s desetinnou čárkou. Spíše bych měl napsat s desetinnou tečkou. |
| numeric(p,d) | "Reálné číslo" | Číslo se zadanou přesností. Parametr p určuje celou délku čísla, parametr d kolik z toho bude za desetinnou čárkou. Například za numeric(5,3) můžete dosadit maximálně [+/-]99.999. |
| serial * | "Automatické (celé) číslo" | Do sloupce s tímto typem se automaticky ukládá nepoužité číslo. Začíná se od 1, pokračuje 2,3,4 atd. (není li určeno jinak). Hodí se jako primární klíč. Více o serial. |
| date | "Datum" | Zadává se jako textový řetězec ve tvaru '2002-09-26'. |
| time | "Čas" | Zadává se jako textový řetězec ve tvaru '13:00:13.440270'
(Přesnost na milióntinu vteřiny), nebo jen '13:00:00'
(hodiny,minuty,vteřiny) nebo jen hodiny:minuty. Jakým způsobem se odděluje čas (jestli dvojtečkou, nebo tečkou) záleží na tom, co jste vybrali při instalaci (v různých zemích se píše jinak). |
| timestamp | "Čas+datum" | '2002-09-26 13:07:40' |
* U typu SERIAL se ještě trochu pozastavím. Pokud jej v nějakém sloupci použijete, pro jeho správnou funkci se vytvoří v databázi objekt sekvence. Všechny sekvence v tabulce můžete vypsat pomocí metapříkazu \ds. Po zrušení tabulky obsahující datový typ SERIAL je třeba zrušit i tuto sekvenci a to příkazem DROP SEQUENCE nazev_sekvence. Název sekvence se generuje automaticky a to ve tvaru nazevtabulky_nazevsloupce_seq. Vytvořit sekvenci můžete pomocí CREATE SEQUENCE. To už je o sekvencích prozatím snad až dost.
Při psaní SQL příkazů na velikostech písmen nezáleží, ale pro přehlednost budu psát nezaměnitelné výrazy velkými písmeny, výrazy, za které si dosazujete svoje jména, malými.
Příkazy SQL se v Postgresu ukončují středníkem. První řádek jsem ukončil stiskem klávesy ENTER. Všimněte si, jak se změnil prompt. Místo rovnítka je tam kulatá závorka, která nás upozorňuje na to, že jsme v některém z předchozích řádků začali se závorkou a měli bychom jí ukončit. Telefon jsem určil jako datový typ VARCHAR, neboť s telefonem nebudu provádět žádné matematické operace (sčítání telefonů není moc užitečné). Tím se můžu vyvarovat někdy v budoucnu chyb, protože kdybych se pokusil telefony sčítat, Postgres ohlásí chybu "sčítání řetězců" (není to zas tak nemožná chyba jak se může zdát!).rimmer1=> CREATE TABLE telefoni_seznam (jmeno VARCHAR(20), rimmer1(> prijmeni VARCHAR(20),telefon VARCHAR(20)); CREATE
Poslední věc o které bych se měl zmínit je hlášení, které se vám vypíše po provedení SQL příkazu. V tomto případě vidíte hlášení CREATE, které Vám oznamuje, že tabulka byla vytvořena. V případě, že se jí nepodaří vytvořit, vypíše se chybové hlášení s popisem chyby, která neumožnila příkaz provést (podobná hlášení obdržíte i od ostatních příkazů SQL). Zkuste třeba znovu vytvořit tabulku telefoni_seznam (šipkou nahoru se "vyrolujete" k příkazu CREATE TABLE).
Nelekejte se, to není konec světa. Tabulka telefoni_seznam, která již existovala existuje dál a stále obsahuje všechny hodnoty, které jste do ní vložily (Zatím jste nevložili žádné :-)).rimmer1=> CREATE TABLE telefoni_seznam (jmeno varchar(20), rimmer1(> prijmeni VARCHAR(20),telefon VARCHAR(20)); ERROR: Relation 'telefoni_seznam' already exists
Nyní se můžete přesvědčit, zda je tabulka ve vaší databázi, metapříkazem \d.
rimmer1=> \d
List of relations
Name | Type | Owner
-----------------+-------+--------
pokus | table | rimmer
telefoni_seznam | table | rimmer
(2 rows)
rimmer1=> \d telefoni_seznam
Table "telefoni_seznam"
Column | Type | Modifiers
----------+-----------------------+-----------
jmeno | character varying(20) |
prijmeni | character varying(20) |
telefon | character varying(20) |
Pokud do některého sloupce nechcete vložit hodnotu, můžete použít speciální hodnotu NULL. Tato hodnota se může použít za libovolný datový typ a říká, že položka "nemá žádnou zadanou hodnotu". Hodnota NULL se ničemu nerovná. Pokud jí třeba použijete za datový typ integer, pak NULL rozhodně není 0 (nula je totiž hodnotou)! Hodnota NULL není ani větší ani menší než jakákoliv jiná hodnota (tj. podmínka promenna > NULL bude vyhodnocena jako false, stejně tak i promenna < NULL).
rimmer1=> INSERT INTO telefoni_seznam VALUES('Santa','Klaus','22222222');
INSERT 18639 1
rimmer1=> INSERT INTO telefoni_seznam VALUES(NULL,'Satan','22222221');
INSERT 18646 1
Pokud budete mít hodně sloupců a budete chtít vytvořit řádek s
hodnotami jen v některých sloupcích, pak můžete vyjmenovat jména
sloupců, do kterých dosazujete, za jménem tabulky (v závorce
oddělené čárkou). Sloupce, do kterých nic nevložíte budou mít
hodnotou NULL.
rimmer1=> INSERT INTO telefoni_seznam(prijmeni,telefon)
rimmer1-> VALUES ('Lucifer','22222223');
INSERT 18647 1
rimmer1=> SELECT * FROM telefoni_seznam;
jmeno | prijmeni | telefon
-------+----------+----------
Santa | Klaus | 22222222
| Satan | 22222221
| Lucifer | 22222223
(3 rows)
Jste-li nedočkaví, můžete se nyní mrknout na
kapitoly o příkazu SELECT SELECT a SELECT II. K těmto kapitolám se dostanete později,
až budete mít některé další potřebné znalosti.
Jak vidíte, příkaz DROP TABLE slouží ke zrušení tabulky. Pokud tabulku zrušíte, přijdete nenávratně i o všechny data v ní! Syntaxe je taková, že nejdříve napíšete klíčová slova DROP TABLE, potom jméno tabulky, popřípadě další jména tabulek určených ke zrušení oddělených od sebe čárkou.rimmer1=> \h DROP TABLE Command: DROP TABLE Description: remove a table Syntax: DROP TABLE name [, ...]
rimmer1=> DROP TABLE telefoni_seznam,pokus; DROP
