-- Dokumentace k integritnim omezenim zde

-- tabulka vydavatelu knih s pojmenovanym primarnim klicem vydavatel_id a
-- jmenem vydavatele, ktere musi byt vyplneno a zadano velkymi pismeny 
SQL> CREATE TABLE vydavatele (
        vydavatel_id NUMBER CONSTRAINT pk_vydavatelid PRIMARY KEY,
        vydavatel_jmeno VARCHAR2(50) CONSTRAINT vydavatel_upper CHECK(vydavatel_jmeno = UPPER(vydavatel_jmeno))
                                     CONSTRAINT vydavatel_notnull NOT NULL
                                     CONSTRAINT vydavatel_uniq UNIQUE);

Table created.

-- vlozeni legalniho zaznamu do tabulky vydavatele
SQL>  INSERT INTO vydavatele (vydavatel_id, vydavatel_jmeno) VALUES (1, 'BB ART');

1 row created.

-- chyba: vlozeni zaznamu bez vyplneneho jmena
SQL>  INSERT INTO Vydavatele (vydavatel_id) VALUES (3);

INSERT INTO Vydavatele (vydavatel_id) VALUES (3)
            *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("XDOHNAL"."VYDAVATELE"."VYDAVATEL_JMENO")


-- chyba: vlozeni zaznamu bez velkych pismen:
SQL> INSERT INTO Vydavatele (vydavatel_id, vydavatel_jmeno) VALUES (2, 'Grada');

INSERT INTO Vydavatele (vydavatel_id, vydavatel_jmeno) VALUES (2, 'Grada')
            *
ERROR at line 1:
ORA-02290: check constraint (XDOHNAL.VYDAVATEL_UPPER) violated


-- chyba: vlozeni neunikatniho zaznamu
SQL>  INSERT INTO Vydavatele (vydavatel_id, vydavatel_jmeno) VALUES (2, 'BB ART');

INSERT INTO Vydavatele (vydavatel_id, vydavatel_jmeno) VALUES (2, 'BB ART')
            *
ERROR at line 1:
ORA-00001: unique constraint (XDOHNAL.VYDAVATEL_UNIQ) violated



*** Ukol1:
Nastavte id v tabulce knihy jako primarni klic a nazvete jej pk_bookid.

SQL> ALTER TABLE knihy ...;


*** Ukol2:
Nastavte vydavatel_id v tabulce knihy jako cizi klic do tabulky vydavatele a nazvete jej fk_publishid.

SQL> ALTER TABLE knihy ...;


*** Ukol3:
Vlozte knihu s id 4 a nazvem 'Nemame na vybranou' od vydavatele 3.
Lze to provest?


*** Ukol4:
Vlozte knihu s id 4 a nazvem 'SQL pro seniory', ktery nema vydavatele (NULL).
Lze to provest?


-- TODO: Vytvorit ukol na check contraint, ktery pracuje bud s null nebo vyzaduje jinou hodnotu...


--chyba: nelze odstranit vydavatele, ktery je referencovan zaznamen z tabulky Knihy 
SQL> DELETE FROM Vydavatele WHERE vydavatel_id = 1;

DELETE FROM Vydavatele WHERE vydavatel_id = 1
            *
ERROR at line 1:
ORA-02292: integrity constraint (XDOHNAL.FK_PUBLISHID) violated - child record found


--chyba: nelze odstranit tabulku, na kterou je uvedena reference pres FOREIGN KEY
SQL> DROP TABLE Vydavatele;

DROP TABLE Vydavatele
           *
ERROR at line 1:
ORA-02449: unique/primary keys in table referenced by foreign keys


-- odstraneni tabulky Vydavatele vcetne vsech souvisejicich integritnich
-- omezeni (Knihy.fk_publishid)
SQL> DROP TABLE Vydavatele CASCADE CONSTRAINTS;

Table dropped.


--zobrazi informace o vytvorenych integritnich omezenich vcetne jeho typu
--ze systemove tabulky 'user_constraints'
--(dalsi zajimava tabulka je 'user_cons_columns', ktera zobrazuje na kterem sloupci je dane omezeni definovano) 
SQL>  SELECT constraint_name, constraint_type FROM user_constraints WHERE UPPER(table_name) = 'VYDAVATELE';

CONSTRAINT_NAME                C
------------------------------ -
VYDAVATEL_NOTNULL              C
VYDAVATEL_UPPER                C
PK_VYDAVATELID                 P
VYDAVATEL_UNIQ                 U

--pripadne prikaz, ktery zobrazi i podminku daneho omezeni
--(dalsi zajimava tabulka je 'user_cons_columns') 
SQL>  SELECT constraint_name, constraint_type, search_condition FROM user_constraints WHERE UPPER(table_name) = 'VYDAVATELE';


--Zobrazeni sloupcu, na kterych je omezeni definovano 
SQL>  SELECT constraint_name, column_name FROM user_cons_columns WHERE UPPER(table_name) = 'VYDAVATELE' AND UPPER(constraint_name) = 'PK_VYDAVATELID';