Ograničenja
Ciljevi Poslije kompletiranja ove lekcije trebalo bi se biti u mogućnosti: Opisati ograničenja Generisati i održavati ograničenja u bazi Generisati i održavati ograničenja u bazi podataka
Uvod Šta su ograničenja (eng. constraints)? Nametnuta pravila za tabele Pravila koja onemogućavaju brisanje tabela ako postoje zavisnosti Prvila koja onemogućavaju ažuriranje vrijednosti podataka u kolonama ako nad njima postoje definisani referencijalni integriteti Postoje sljedeći tipovi ograničenja nad kolonama tabele: NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK
Ograničena ORACLE Imena ograničenja, ako se automatski generišu, imenuju se u formatu SYS_Cn gdje je n redni broj ograničenja Kreiranje ograničenja se generiše: Kada se kreira tabela ili Nakon kreiranja tabele nepostrednim korištenjem komante ALTER TABLE ADD CONSTRAINT Ograničenja se definišu na nivou kolone ili tabele Sva ograničenja (eng. constraints) se zapisuju u šemi baze podataka, a vidljivi su putem Data Dictionary-a
Definisanje ograničenja CREATE TABLE [schema.]table (column datatype [DEFAULT expr] [column_constraint],... [table_constraint][,...]); CREATE TABLE emp( empno NUMBER(4), ename VARCHAR2(10),... deptno NUMBER(2) NOT NULL, CONSTRAINT emp_empno_pk PRIMARY KEY (EMPNO));
Definisanje ograničenja Ograničenje na nivou kolone column [CONSTRAINT constraint_name] constraint_type, Ograničenje na nivou tabele column,... [CONSTRAINT constraint_name] constraint_type (column,...),
NOT NULL ograničenja SQL> CREATE TABLE employees 2 (employee_id NUMBER(6,0) NOT NULL, 3 first_name VARCHAR2(20), 4 last_name VARCHAR2(25) NOT NULL, 5 email VARCHAR2(25) NOT NULL, 6 phone_number VARCHAR2(20), 7 hire_date DATE NOT NULL, 8 job_id VARCHAR2(10) NOT NULL, 9 salary NUMBER(8,2), 10 commission_pct NUMBER(2,2), 11 manager_id NUMBER(6,0), 12 department_id NUMBER(4,0)); EMPLOYEE_ID LAST_NAME HIRE_DATE MANAGER_ID DEPARTMENT_ID 198 OConnell 21-Jun-1999 124 50 100 King 17-Jun-1987 90 110 Chen 28-Sep-1997 108 100 117 Tobias 24-Jul-1997 114 30 178 Grant 24-May-1999 149 NOT NULL NOT NULL NOT NULL DOZVOLJENE SU NULL VRIJEDNOSTI
NOT NULL ograničenja SQL> CREATE TABLE emp( employee_id NUMBER(6), 2 last_name VARCHAR2(25) NOT NULL, 3 salary NUMBER(8,2), 4 commission_pct NUMBER(2,2), 5 hire_date DATE 6 CONSTRAINT emp_hire_date_nn NOT NULL,... Kolona last_name hire_date Ograničenje SYS_C007357 EMP_HIREDATE_NN Sistemski dodijeljen naziv ograničenja Eksplicitno dodijeljen naziv ograničenja
UNIQUE ograničenje SQL> CREATE TABLE dept( department_id NUMBER(6), 2 department_name VARCHAR2(25) UNIQUE, 3 location_id NUMBER(4,0), 3 manager_id NUMBER(6,0) 4 CONSTRAINT dept_manid_uq UNIQUE, 5... Kolona department_name Ograničenje SYS_C007361 manager_id DEPT_MANID_UQ Sistemski dodijeljen naziv ograničenja Eksplicitno dodijeljen naziv ograničenja Department_id Department_name Location_id Manager_id 10 Administration 1700 200 60 IT 1400 103 90 Executive 1700 100 Insert novog sloga 120 Prodaja 1700 100
PRIMARY KEY ograničenje Dozvoljeno je definisanje primarnog ključa ili na novou tabele ili na nivou kolone SQL> CREATE TABLE dept( 2 deptno NUMBER(2), 3 dname VARCHAR2(14), 4 loc VARCHAR2(13), 5 CONSTRAINT dept_dname_uk UNIQUE (dname), 6 CONSTRAINT dept_deptno_pk PRIMARY KEY(deptno)); SQL> CREATE TABLE emp( 2 empno NUMBER(6,0) PRIMARY KEY, 3 ename VARCHAR2(14), 4 job VARCHAR2(30),...
FOREIGN KEY ograničenje DEPT PRIMARY KEY DEPTNO DNAME LOC 10 Administration New York 20 Sales Dallas PRIMARY KEY... FOREIGN KEY EMP EMPNO ENAME JOB... DEPTNO 100 King Steven President 10 198 OConnell Donald Finance Manager 50... INSERT INTO EMP EMPNO ENAME JOB... DEPTNO 300 King Nubelix Manager 12 300 King Nubelix Manager 50 Insert nije dozvoljen deptno = 12 ne postoji Dozvoljen insert
FOREIGN KEY ograničenje FOREIGN KEY ograničenje moguće je definisati na nivou tabele ili na nivou kolone SQL> CREATE TABLE emp( 2 empno NUMBER(4), 3 ename VARCHAR2(10) NOT NULL, 4 job VARCHAR2(9), 5 mgr NUMBER(4), 6 hiredate DATE, 7 sal NUMBER(7,2), 8 comm NUMBER(7,2), 9 deptno NUMBER(7,2) NOT NULL, 10 CONSTRAINT emp_deptno_fk FOREIGN KEY (deptno) 11 REFERENCES dept (deptno)); FOREIGN KEY određuje kolonu u podređenoj tabeli na nivou ograničenja tabele REFERENCES određuje kolonu u nadređenoj tabeli ON DELETE CASCADE omogućava brisanje redova u nadređenoj tabeli i svih zavisnih redova (slogova) u podređenoj tabeli
CHECK ograničenje Definiše uslov koji svaki red mora zadovoljavati Izrazi koji nisu dozvoljeni: Referenciranje na: CURRVAL, NEXTVAL, LEVEL i ROWNUM pseoudo kolone Poziv na SYSDATE, UID, USER funkcije Upite koji se odnose na vrijednosti iz drugih redova..., deptno NUMBER(2), CONSTRAINT emp_deptno_ck CHECK (DEPTNO BETWEEN 10 AND 99),...
Dodavanje ograničenja Dozvoljeno je dodavanje ili brisanje, ali ne i modifikovanje ograničenja Omogućavanje ili onemogućavanje ograničenja Dodavanje NOT NULL ograničenja putem MODIFY klauzule ALTER TABLE table ADD [CONSTRAINT constraint] type (column);
Dodavanje ograničenja SQL> ALTER TABLE emp 2 ADD CONSTRAINT emp_mgr_fk 3 FOREIGN KEY(mgr) REFERENCES emp(empno); Table altered. Dodavanje ograničenja nad tabelom emp i kolonom mgr (manager) inicira da zaposleni mora već postojati u tabeli emp da bi bilo moguće popuniti ovu kolonu sa nekom od dozvoljenih vrijednosti.
Brisanje ograničenja Brisanje ograničenja za manager-a iz tabele emp SQL> ALTER TABLE emp 2 DROP CONSTRAINT emp_mgr_fk; Table altered. Brisanje primarnog ključa nad tabelom DEPT i svi foreign key-a u tabeli EMP nad kolonom DEPTNO (tj. EMP.DEPTO) SQL> ALTER TABLE dept 2 DROP PRIMARY KEY CASCADE; Table altered.
Deaktiviranje i aktiviranje ograničenja Izvršenjem DISABLE klauzule ALTER TABLE iskaza deaktivira se integritet ograničenja Prihvatanjem CASCADE opcije onemogućava se zavisnost cjelokupnog ograničenja SQL> ALTER TABLE emp 2 DISABLE CONSTRAINT emp_empno_pk CASCADE; Table altered. Izvršenjem ENABLE klauzule ALTER TABLE iskaza aktivira se integritet ograničenja UNIQUE i PRIMARY KEY indeksi se automatski kreiraju kada se aktiviraju UNIQUE i PRIMARY KEY ograničenja SQL> ALTER TABLE emp 2 ENABLE CONSTRAINT emp_empno_pk; Table altered.
Kaskadno ograničenje Klauzula CASCADE CONSTRAINTS se koristi zajedno s klauzulom DROP COLUMN CASCADE CONSTRAINTS klauzula briše sva referencijalna ograničenja koja se odnose na PRIMARY KEY i UNIQUE KEY definisane nad kolonom koja se briše CASCADE CONSTRAINTS klauzula takođe briše sva ograničenja definisana nad više kolona kada se briše bar jedna kolona iz ograničenja
Pregled ograničenja Upitom na USER_CONSTRAINTS tabelu mogu se vidjeti sva definisana ograničenja SQL> SELECT constraint_name, constraint_type, 2 search_condition 3 FROM user_constraints 4 WHERE table_name = 'EMPLOYEES'; CONSTRAINT_NAME C SEARCH_CONDITION ------------------------ - ------------------------- EMP_LAST_NAME_NN C "LAST_NAME" IS NOT NULL EMP_HIRE_DATE_NN C "HIRE_DATE" IS NOT NULL EMP_EMAIL_UK U EMP_EMPNO_PK P...
Pregled kolona koje imaju pridružena ograničenja Pregled kolona kojima je pridružena ograničenja mogu se vidjeti u tabeli USER_CONS_COLUMNS SQL> SELECT constraint_name, column_name 2 FROM user_cons_columns 3 WHERE table_name = 'EMPLOYEES'; CONSTRAINT_NAME COLUMN_NAME ------------------------- ---------------------- EMP_HIRE_DATE_NN HIRE_DATE EMP_EMAIL_UK EMAIL EMP_EMP_ID_PK EMPLOYEE_ID EMP_MANAGER_FK EMPNO EMP_DEPT_FK DEPARTMENT_ID...
Kratak pregled Tipovi ograničenja koji se mogu definisati nad bazom podataka prilikom kreiranja tabela su: NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK USER_CONSTRAINTS i USER_CONS_COLUMNS su tabele preko kojih se mogu vidjeti sve potrebne informacije vezane za definisana ograničenja nad kolonama tabela
Ograničenja