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

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

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


-- vlozeni legalniho zaznamu do tabulky Vydavatele
SQL>  INSERT INTO Vydavatele (vydavatel_id, vydavatel_jmeno) VALUES (1, 'GRADA');

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 ("XSVENDA"."VYDAVATELE"."VYDAVATEL_JMENO")


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

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


-- chyba: vlozeni neunikatniho zaznamu
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-00001: unique constraint (XSVENDA.VYDAVATEL_UNIQ) violated


-- kniha_id je primarni klic. constraint pojmenovan jako pk_bookid;
-- kniha_jmeno musi byt vyplnen a unikatni. constraint neni pojmenovan;
-- nakladatel musi byt vyplnen. Prodej zahajen dle 'start_prodeje', pokud
-- neni pri vkladani vyplneno, pouzije se aktualni datum 
SQL>  CREATE TABLE Knihy (
	kniha_id NUMBER CONSTRAINT pk_bookid PRIMARY KEY,
	kniha_jmeno VARCHAR2(30) NOT NULL UNIQUE,
	vydavatel_id NUMBER NOT NULL,        
	start_prodeje DATE DEFAULT SYSDATE);

Table created.

--pridame pozadavek na vyplneni polozky isbn a jeji unikatnost 
SQL> ALTER TABLE Knihy ADD CONSTRAINT uniq_isbn isbn VARCHAR2(15) UNIQUE NOT NULL;

Table altered.

--pridame referenci na cizi klic z tabulky Vydavatele na polozku
--Vydavatele.vydavatel_id. od teto chvile bude kontrolovan vyskyt hodnoty
--Knihy.vydavatel_id v tabulce Vydavatele a tabulka Vydavatele pujde
--odstranit az po odstraneni tabulky Knihy (ktera ji referencuje)  

SQL> ALTER TABLE Knihy ADD CONSTRAINT fk_publishid FOREIGN KEY (vydavatel_id) REFERENCES Vydavatele(vydavatel_id);

Table altered.

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


--vlozeni legalniho zaznamu do tabulky Knihy 
SQL> INSERT INTO Knihy (kniha_id, kniha_jmeno, isbn, vydavatel_id) VALUES (1, 'Citadela', '80-5246545-321', 1);

1 row created.

--chyba: nelze vlozit zaznam do Knih pro neexistujiciho vydavatele 
SQL> INSERT INTO Knihy (kniha_id, kniha_jmeno, isbn, vydavatel_id) VALUES (2, '1984', '80-032453434-12', 3);

INSERT INTO Knihy (kniha_id, kniha_jmeno, isbn, vydavatel_id) VALUES (2,
            *
ERROR at line 1:
ORA-02291: integrity constraint (XSVENDA.FK_PUBLISHID) violated - parent key
not found


--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 (XSVENDA.FK_PUBLISHID) violated - child record
found

-- odstraneni omezeni na unikatnost jmena vydavatele
SQL> ALTER TABLE VYdavatele DROP CONSTRAINT vydavatel_uniq; 

Table altered.

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

Table dropped.