CDI.CZ
hledá
nové PHP programátory.
Požadavky:
- Zkušenosti s PHP
- Znalost OOP
- Zkušenosti s návrhem databáze (MySQL)
- Znalost problematiky webových aplikací
Strukturovaný životopis můžete zasílat na petr@cdi.cz.
V příkladu jsem schválně vytvořil nejdříve sekvenci, aby bylo jasné, že je to objekt, který není nijak s tabulkou či sloupcem svázán. Proto si musíte dát pozor při rušení tabulky, která nějakou sekvneci využívá, aby jste z databáze smazali i sekvenci. Jinak Vám bude v databází zůstávat "smetí". Sekvnece se zruší pomocí DROP SEQUENCE.rimmer1=> CREATE SEQUENCE mutant_c_seq; CREATE rimmer1=> CREATE TABLE mutant (slovo VARCHAR(10), c1 INTEGER, c2 INTEGER); CREATE
Skuste si vytvořit tabulku s typem SERIAL, poté tabulku zrušit (sekvneci ponechat) a stejným příkazem jako poprvé tabulku vytvořit. Kvůli existující sekvneci se to nepodaří.
Podívejme se, co se stane, když přiřadíme sekvenci dvěma sloupcům.
rimmer1=> ALTER TABLE mutant ALTER c1 SET DEFAULT
rimmer1-> nextval('"mutant_c_seq"'::tex\t);
ALTER
rimmer1=> ALTER TABLE mutant ALTER c2 SET DEFAULT
rimmer1-> nextval('"mutant_c_seq"'::tex\t);
ALTER
rimmer1=> INSERT INTO mutant VALUES ('jedna');
INSERT 17065 1
rimmer1=> INSERT INTO mutant VALUES ('dva');
INSERT 17066 1
rimmer1=> INSERT INTO mutant VALUES ('tri');
INSERT 17067 1
rimmer1=> SELECT * FROM mutant;
slovo | c1 | c2
-------+----+----
jedna | 1 | 2
dva | 3 | 4
tri | 5 | 6
(3 rows)
Jak vidíte, při dostazování jsme využili defaultních hodnot pro
sloupce c1 a c2. Ačkoliv to vypadá velice efektivně,
chtěl bych jen tak na okraj podotknout, že nám to nezaručuje
unikátní hodnoty pro oba sloupce, jak by se mohlo zdát. Unikátní
hodnoty zajišťuje podmínka UNIQUE,
která dokáže zajistit unikátnost jen pro jeden sloupec. Nehledě na
to, že jsme tuto podmínku v příkladu ani neužili, proto nemáme
unikátnost hodnot zaručenou ani pro jeden sloupec !!
Při vytváření sekvence můžete nastavit její minimální hodnotu (implicitně 1), maximální hodnotu (implicitně maximální hodnota typu integer) a krok, tj. o kolik se bude další hodnota zvyšovat (implicitně 1). Jak se to udělá snadno vyčtete z nápovědy.
Příkaz CREATE INDEX neslouží jen k "hlídání" unikátní hodnoty, ale také například k rychlejšímu vyhledávání v sloupci (sloupcích), ale jeho další významy zde popisovat nebudu. Na úplnou syntaxi příkazu se můžete podívat pomocí metapříkazu \h.
Příklad vytvoření indexu:
Snad ani nemá cenu říkat, že se první pokus o vytvoření unikátního indexu nezdařil, protože sloupec jedna neobsahoval samé unikátní hodnoty. Sloupec dva po vytvoření unikátního indexu již nedovoluje vložit dvě stejné hodnoty.rimmer1=> CREATE TABLE cisla (jedna INTEGER, dva FLOAT); CREATE rimmer1=> INSERT INTO cisla VALUES (1,1); INSERT 17088 1 rimmer1=> INSERT INTO cisla VALUES (1,2); INSERT 17089 1 rimmer1=> CREATE UNIQUE INDEX cisla_jedna_key ON cisla (jedna); ERROR: Cannot create unique index. Table contains non-unique values rimmer1=> CREATE UNIQUE INDEX cisla_dva_key ON cisla (dva); CREATE rimmer1=> INSERT INTO cisla VALUES (1); INSERT 17092 1 rimmer1=> INSERT INTO cisla (dva) VALUES (2); ERROR: Cannot insert a duplicate key into unique index cisla_dva_key
Index také umožňuje hlídat unikátnost řádků v několika sloupcích. Jinak řečeno, zabrání vložení řádku který by měl ve (všech) vybraných sloupcích stejné hodnoty jako jiný řádek. Vybranými sloupci myslím ty sloupce, které byli vybrány při vytváření indexu.
rimmer1=> CREATE TABLE vektor (jmeno CHAR(10), i INTEGER,j INTEGER);
CREATE
rimmer1=> CREATE UNIQUE INDEX vektor_key ON vektor(i,j);
CREATE
rimmer1=> INSERT INTO vektor VALUES ('jedna',3,1);
INSERT 17118 1
rimmer1=> INSERT INTO vektor VALUES ('dva',0,5);
INSERT 17119 1
rimmer1=> INSERT INTO vektor VALUES ('dva',1,0);
INSERT 17120 1
rimmer1=> INSERT INTO vektor VALUES ('dva',1,0);
ERROR: Cannot insert a duplicate key into unique index vektor_key
Pokud by jste chtěli, aby např. řádek i nemohl obsahovat dvě
stejná čísla, museli by jste navíc vytvořit index jen pro tento
řádek.
Podívejte se, jaké jsem měl dilema při vytváření tabulky telefony v kapitole 10.
