CONSTRAINT
Specifikace integritních omezení
Integritní omezení je možné vytvářet:
1. uvnitř (column constraints)
2. vně specifikace sloupce (table constraints)
Ve většině případů je možné použít kteroukoli možnost. Existují dvě výjimky NOT NULL je nutno definovat jako "column constraints" a pokud IO obsahuje více než jeden sloupec definuje se jako "table constraints". Ve výše uvedeném příkladu byly při vytváření tabulky EXEMPLAR integritní omezení definované jako "column constraints" tj. uvnitř specifikace sloupce. Pokud by se stejná integritní omezení definovaly formou "table constraints" příkaz CREATE TABLE by vypadal následovně:
CREATE TABLE exemplar
(id NUMBER(6,0),
isbn VARCHAR2(16),
dat_nakupu DATE DEFAULT SYSDATE,
vypujceno CHAR(1),
PRIMARY KEY (id),
FOREIGN KEY(isbn) REFERENCES kniha,
CHECK (vypujceno IN ('A','N')));
(id NUMBER(6,0),
isbn VARCHAR2(16),
dat_nakupu DATE DEFAULT SYSDATE,
vypujceno CHAR(1),
PRIMARY KEY (id),
FOREIGN KEY(isbn) REFERENCES kniha,
CHECK (vypujceno IN ('A','N')));
Chceme-li definovat unikátní klíč např. na spojení sloupců ID a ISBN, musíme toto integritní omezení definovat také jako “table constraints” protože zahrnuje dva sloupce.(Definici nelze přímo přiřadit ke sloupci).
Pojmenování integritních omezení
Ke zvýšení přehlednosti integritních omezení je možno využít možnosti integritní omezení pojmenovat. Příkaz pro vytvoření tabulky EXEMPLAR by pak mohl vypadat následovně:
CREATE TABLE exemplar
(id NUMBER(6,0) CONSTRAINT exemplar_klic PRIMARY KEY,
isbn VARCHAR2(16),
dat_nakupu DATE DEFAULT SYSDATE,
vypujceno CHAR(1),
CONSTRAINT exemplar_ref_kniha FOREIGN KEY(isbn) REFERENCES kniha,
CONSTRAINT exemplar_vycet_vypujceno CHECK (vypujceno IN ('A','N')));
(id NUMBER(6,0) CONSTRAINT exemplar_klic PRIMARY KEY,
isbn VARCHAR2(16),
dat_nakupu DATE DEFAULT SYSDATE,
vypujceno CHAR(1),
CONSTRAINT exemplar_ref_kniha FOREIGN KEY(isbn) REFERENCES kniha,
CONSTRAINT exemplar_vycet_vypujceno CHECK (vypujceno IN ('A','N')));
Zjištění názvů integritních omezení
Názvy různých integritních omezení můžeme zjistit pomocí dotazu na pohled USER_CONSTRAINTS systémového katalogu. Struktura tohoto pohledu je:
SQL> DESCRIBE user_constraints
Name Null? Type
------------------------------- -------- ----
OWNER NOT NULL VARCHAR2(30)
CONSTRAINT_NAME NOT NULL VARCHAR2(30)
CONSTRAINT_TYPE VARCHAR2(1)
TABLE_NAME NOT NULL VARCHAR2(30)
SEARCH_CONDITION LONG
R_OWNER VARCHAR2(30)
R_CONSTRAINT_NAME VARCHAR2(30)
DELETE_RULE VARCHAR2(9)
STATUS VARCHAR2(8)
SELECT constraint_name, constraint_type, search_condition
FROM user_constraints
WHERE table_name = 'KNIHA';
CONSTRAINT_NAME C
------------------------------ -
SEARCH_CONDITION
--------------------------------------------------------------------------------
SYS_C003721 C
AUTOR IS NOT NULL
SYS_C003722 P
SYS_C003723 U
Name Null? Type
------------------------------- -------- ----
OWNER NOT NULL VARCHAR2(30)
CONSTRAINT_NAME NOT NULL VARCHAR2(30)
CONSTRAINT_TYPE VARCHAR2(1)
TABLE_NAME NOT NULL VARCHAR2(30)
SEARCH_CONDITION LONG
R_OWNER VARCHAR2(30)
R_CONSTRAINT_NAME VARCHAR2(30)
DELETE_RULE VARCHAR2(9)
STATUS VARCHAR2(8)
SELECT constraint_name, constraint_type, search_condition
FROM user_constraints
WHERE table_name = 'KNIHA';
CONSTRAINT_NAME C
------------------------------ -
SEARCH_CONDITION
--------------------------------------------------------------------------------
SYS_C003721 C
AUTOR IS NOT NULL
SYS_C003722 P
SYS_C003723 U
Vysvětlivky ke sloupci CONSTRAINT_TYPE (v záhlaví zobrazen jako “C”):
1. P PRIMARY KEY
2. U UNIQUE
3. C CHECK
NOT NULL
Rozlišení zda se jedná o CHECK nebo NOT NULL je ve sloupci SEARCH_CONDITION)
zdroj: http://www.cs.vsb.cz/ticha/oracle/hlavni3.html