Jenom na okraj bych podotknul, že primární klíč by měl být jako první sloupec. Urychluje to práci s databází. Také je zvykem jej pojmenovat id.rimmer1=> CREATE TABLE zaci (id SERIAL NOT NULL PRIMARY KEY, rimmer1(> jmeno VARCHAR(20) CHECK (jmeno != '') NOT NULL, rimmer1(> prijmeni VARCHAR(20) CHECK (prijmeni != '') NOT NULL, rimmer1(> pohlavi BOOL NOT NULL DEFAULT true); NOTICE: CREATE TABLE will create implicit sequence 'zaci_id_seq' for SERIAL column 'zaci.id' NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index 'zaci_pkey' for table 'zaci' CREATE rimmer1=> CREATE TABLE znamky (zak INTEGER REFERENCES zaci(id) NOT NULL, rimmer1(> znamka NUMERIC(1,0) CHECK (znamka >=1 AND znamka <= 5) DEFAULT 5, rimmer1(> datum DATE DEFAULT current_date); NOTICE: CREATE TABLE will create implicit trigger(s) for FOREIGN KEY check(s) CREATE
Poznámka: current_date je funkce Postgresu vracející aktuální datum v době použití funkce (tj. v době vložení hodnot do tabulky).
rimmer1=> INSERT INTO zaci VALUES (1,'Jan','Maly');
INSERT 19315 1
rimmer1=> INSERT INTO zaci VALUES (2,'Jana','Mala',false);
INSERT 19316 1
rimmer1=> INSERT INTO zaci(jmeno,prijmeni,pohlavi) VALUES ('Jana','Mala',false);
INSERT 19317
rimmer1=> INSERT INTO znamky VALUES (1);
INSERT 19294 1
rimmer1=> INSERT INTO znamky VALUES (1,3);
INSERT 19295 1
rimmer1=> INSERT INTO znamky VALUES (2,3,'20.05.2002');
INSERT 19296 1
rimmer1=> INSERT INTO znamky(zak,znamka) VALUES (2,1);
INSERT 19298 1
rimmer1=> INSERT INTO znamky(znamka,zak) VALUES (2,1);
INSERT 19299 1
rimmer1=> select * FROM znamky;
zak | znamka | datum
-----+--------+------------
1 | 5 | 2002-10-26
1 | 2 | 2002-10-26
2 | 2 | 2002-05-20
2 | 1 | 2002-10-26
1 | 2 | 2002-10-26
(5 rows)
Vše za -- (dvěmi mínus) je až do konce řádku považováno za komentář.rimmer1=> ALTER TABLE znamky RENAME TO hodnoceni; -- prejm. tabulky ALTER rimmer1=> ALTER TABLE hodnoceni RENAME zak TO jmeno; -- prejm. sloupce ALTER rimmer1=> ALTER TABLE zaci ADD rodne_cislo CHAR(10) UNIQUE; NOTICE: ALTER TABLE / ADD UNIQUE will create implicit index 'zaci_rodne_cislo_key' for table 'zaci' ALTER
Pozor! Pokud přejmenujete tabulku zaci, do které se odkazuje tabulka znamky, pak se tato reference poruší a vznikne Vám problém, který neumíte vyřešit (ne že to nejde ...). Stejný problém budete mít, pokud změníte název sloupce id;
rimmer1=> UPDATE zaci SET rodne_cislo = '7901220611' WHERE id = 1; UPDATE 1 rimmer1=> UPDATE zaci SET rodne_cislo = '7951010611', rimmer1-> prijmeni = 'Vdana' WHERE id = 2; UPDATE 1 rimmer1=> UPDATE hodnoceni SET znamka = 1*1+2 WHERE (znamka > 2 AND rimmer1-> znamka < 2+2) OR znamka = 3; -- pekne vypeceny prikaz, ze? :-) UPDATE 2
Zvolit si v tabulce zaci název sloupce jmeno pro referenci do tabulky zaci, kde sloupec s tímto názvem existuje nebylo nejchytřejší. No, stalo se a tak se s tím musíme nějak vypořádat (přest tzv. tečkovou notaci).rimmer1=> SELECT * FROM zaci,hodnoceni WHERE id = jmeno; ERROR: Column reference "jmeno" is ambiguous
rimmer1=> SELECT * FROM zaci,hodnoceni WHERE id = hodnoceni.jmeno;
jmeno | prijmeni | pohlavi | id | rodne_cislo | jmeno | znamka | datum
-------+----------+---------+----+-------------+-------+--------+------------
Jan | Maly | t | 1 | 7901220611 | 1 | 5 | 2002-10-26
Jana | Vdana | f | 2 | 7951010611 | 2 | 1 | 2002-10-26
Jan | Maly | t | 1 | 7901220611 | 1 | 2 | 2002-10-26
Jan | Maly | t | 1 | 7901220611 | 1 | 3 | 2002-10-26
Jana | Vdana | f | 2 | 7951010611 | 2 | 3 | 2002-05-20
(5 rows)
rimmer1=> SELECT zaci.jmeno,prijmeni,datum, znamka FROM zaci,hodnoceni
rimmer1-> WHERE id = hodnoceni.jmeno AND prijmeni = 'Vdana';
jmeno | prijmeni | datum | znamka
-------+----------+------------+--------
Jana | Vdana | 2002-10-26 | 1
Jana | Vdana | 2002-05-20 | 3
(2 rows)
rimmer1=> SELECT jmeno AS odkaz_do_zaci FROM hodnoceni;
odkaz_do_zaci
---------------
1
2
1
1
2
(5 rows)
rimmer1=> DELETE FROM hodnoceni WHERE znamka >= 2*2 AND jmeno = 2 DELETE 0 rimmer1=> DELETE FROM hodnoceni; DELETE 5
rimmer1=> DROP TABLE zaci;
NOTICE: DROP TABLE implicitly drops referential integrity trigger from table "hodnoceni"
DROP
rimmer1=> DROP TABLE hodnoceni;
DROP
rimmer1=> \d
List of relations
Name | Type | Owner
------------------------+----------+--------
oddeleni | table | rimmer
oddeleni_prim_klic_seq | sequence | rimmer
zaci_id_seq | sequence | rimmer
zamestnanci | table | rimmer
(4 rows)
rimmer1=> DROP SEQUENCE zaci_id_seq;
DROP
