Documente Academic
Documente Profesional
Documente Cultură
Lectia 11
Lectia 11
OBIECTIVE
CE SUNT CONSTRÂNGERILE ?
Constrângerile forteaza regulile la nivel de tabela.
Constrângerile previn stergerea unei tabele daca exista dependente.
Urmatoarele tipuri de constrângeri sunt valide în Oracle:
- NOT NULL
- UNIQUE KEY
- PRIMARY KEY
- FOREIGN KEY
- CHECK
Constrângerile
Serverul Oracle foloseste constrângerile ca sa previna introducerea de date invalide in
tabela.
Se pot folosi constrângerile în scopul:
- forteaza regulile la nivel de tabela oriunde un rând este inserat, actualizat sau sters din
tabela. Constrângerea trebuie satisfacuta pentru ca operatia sa se termine cu succes.
- Previne stergerea unei tabele daca exista dependente din alte tabele.
- Ofera reguli pentru Oracle tools, ca de exemplu Developer/2000.
1
Se pot vizualiza constrângerile create pentru o tabela daca ne uitam în dictionarul
USER_CONSTRAINTS.
Definirea constrângerilor
CREATE TABLE [schema.] table
( column datatype [DEFAULT expr]
[column_constraint],
………
[table_constraint]);
În sintaxa avem:
Schema acelasi cu numele proprietarului
Table Numele tabelei
DEFAULT expr Specifica o valoare implicita daca aceasta este omisa la
introducere
Column numele coloanei
Datatype tipul de data si lungimea
Column_constraint Constrângere de integritate ca parte a definitiei coloanei
table_constraint Constrângere de integritate ca parte a definitiei tabelei
În sintaxa:
constrain_name este numele constrângerii
constraint_type este tipul constrângerii
2
Ne asigura ca valorile null nu sunt permise pentru acea coloana.
EMP
EMPNO ENAME JOB … COMM DEPTNO
7839 KING PRESIDENT 10
7698 BLAKE MANAGER 30
7782 CLARK MANAGER 10
7566 JONES MANAGER 20
…
3
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
Insert into
50 SALES DETROIT
60 BOSTON Allowed
O constrângere de integritate cheie unica cere ca fiecare valoare din coloana sau set de
coloane trebuie sa fie unice – doua înregistrari ale tabelei nu pot avea valori duplicat în coloana
sau setul de coloane care formeaza constrangerea. Coloana(setul de coloane) inclusa în definitia
cheii unice se numeste cheie unica. Daca cheia unica contine mai multe coloane se numeste
cheie unica compusa.
Constrângerea cheie unica permite introducerea de valori null daca nu a fost definita o
constrângere NOT NULL pentru acea coloana. De fapt, orice numar de înregistrari pot include
valori null în coloane fara constrângerea NOT NULL. O valoare null într-o coloana (sau în toate
coloanele unei chei unice compuse) întotdeauna satisface o constrângere de cheie unica.
Constrângerea cheie unica (unique key) definita la nivel de tabela sau coloana
PRIMARY KEY
DEPT
DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
4
Insert into
20 MARKETING DALLAS
FINANCE NEW YORK
Not allowed Not allowed
(DEPTNO 20 deja (DEPTNO este
exista) NULL)
Constrângerea de cheie primara creaza o cheie primara pentru fiecare tabela. Doar o
cheie primara poate fi creata pentru fiecare tabela. Constrângerea de cheie primara este o coloana
sau set de coloane care identifica unic fiecare înregistrare din tabela. Aceasta constrângere
forteaza unicitatea coloanei sau a setului de coloane si asigura ca nici o coloana care este parte a
cheii primare nu poate contine o valoare null.
DEPT
PRIMARY KEY DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
….
EMP FOREIGN
EMPNO ENAME JOB … COMM DEPTNO KEY
7839 KING PRESIDENT 10
5
7698 BLAKE MANAGER 30
…
Insert into
Constrângerile cheii externe pot fi definite la nivelul constrângerilor de tabel sau de coloana.
O cheie externa compusa este creata folosind definitiile tabel-nivel.
Exemplul de mai sus defineste o constrângere de tip cheie externa în coloana DEPTNO din
tabela EMP. Numele constrângerii este EMP_DEPTNO_FK.
Constângerile externe sunt definite în tabela copil, si tabela care contine coloana referita se
afla în tabela parinte. Constrângerile externe sunt definite folosind combinatii ale cuvintelor
urmatoare:
6
FOREIGN KEY este folosit pentru a defini coloana în tabela copil la nivelul constângerii
de tabel.
REFERENCES identifica tabela si coloana în tabela parinte.
ON DELETE CASCADE arata când rândul din tabela parinte este sters, rândurile
independente din tabela copil fiind de asemeni sterse.
Fara optiunea ON DELETE CASCADE, rândul din tabela parinte nu va putea fi sters daca
este referit în tabela copil.
Constrângerea CHECK
Constrângerea de verificare
Constrângerea de verificare defineste o conditie pe care fiecare rând trebuie sa o îndeplinesca.
Conditia poate fi folosita în aceleasi constructii ca si conditiile de interogare, cu urmatoarele
exceptii:
Referiri la psoudocoloanele CURRVAL, NEXTVAL, LEVEL, and ROWNUM.
Apeluri la functiile SYSDATE, UID, USER, and USERENV.
Interogari care fac referinte la alte valori din alte rânduri.
Constrângerile de verificare pot fi definite la nivel de coloana sau la nivel de tabel.
Adaugând o constrângere
Atentie: Denumirea constrângerii este optionala, totusi ea este recomandata. Daca nu dati
nume constrângerilor, sistemul va genera el nume.
Ghid:
Se poate adauga, scoate, activa, dezactiva o constrângere, dar nu se poate modifica
structura acesteia.
7
Se poate adauga o constrângere de tip NOT NULL la o coloana existenta folosind clauza
MODIFY din functia ALTER TABLE.
Nota: Se poate defini o coloana NOT NULL doar daca tabela nu contine rânduri, deoarece nu
se pot specifica date pentru rândurile existente în acelasi timp în care adaugam noi coloane.
Adaugând o constrângere
Adaugarea unei contrângeri externe la tabela EMP ne arata ca un manager trebuie sa existe ca
angajat activ în tabela EMP.
SQL> ALTER TABLE emp
2 ADD CONSTRAINT emp_mgr_fk
3 FOREIGN KEY(mgr) REFERENCES emp(empno);
Table altered.
Exemplul de mai sus creaza o contrângere de tip extern în tabela emp. Contrângerea ne
asigura de existenta manager-ului ca angajat activ în tabela EMP.
Sintaxa:
ALTER TABLE table
DROP PRIMARY KEY | UNIQUE (column) |
CONSTRAINT constraint [CASCADE];
Dezactivarea constrângerilor
8
Se poate dezactiva o constrângere fara ca sa fie necesar scoaterea acesteia sau recreerea ei
folosind functia ALTER TABLE împreuna cu clauza DISABLE.
Sintaxa:
ALTER TABLE table
DISABLE CONSTRAINT constraint [CASCADE];
Ghid:
Clauza DISABLE se poate folosi atât în functia CREATE TABLE cât si în functia
ALTER TABLE.
Clauza CASCADE dezactiveaza constrângerile de integritate dependente.
Activarea constrângerilor
Activarea unei constrângeri de integritate care este dezactivata folosind clauza ENABLE
în definirea tabelei.
SQL> ALTER TABLE emp
2 ENABLE CONSTRAINT emp_empno_pk;
Table altered.
Un index de tip unic sau de tip cheie primara este automat creat daca se activeaza
constrângerile UNIQUE sau PRIMARY KEY.
Se poate activa o constrângere fara a o scoate sau a o recrea folosind functia ALTER TABLE
împreuna cu clauza ENABLE.
Sintaxa:
ALTER TABLE table
ENABLE CONSTRAINT constraint;
Ghid:
Daca se activeza o constrângere, constrângerea este aplicata tuturor datelor din tabela.
Toate datele din tabela trebuie sa indeplineasca conditiile din constrângere.
Daca se activeaza o constrangere de tip unic sau cheie primara, atunci este creat în mod
automat un index de tip unic.
Clauza ENABLE se poate folosi atât în functia CREATE TABLE cât si în functia ALTER
TABLE.
Vizualizarea constrângerilor
9
2 search_condition
3 FROM user_constraints
4 WHERE table_name=’EMP’;
CONSTRAINT_NAME C SEARCH_CONDITION
SYS_C00674 C EMPNO IS NOT NULL
SYS_C00675 C DEPTNO IS NOT NULL
EMP_EMPNO_PK P
…
Dupa crearea unei tabele, se poate confirma exitenta sa prin folosirea comenzii DESCRIBE.
Singura constrângere care poate fi verificata este constrângerea NOT NULL. Pentru a vedea
toate constrângerile din tabela, este necesara interogarea tabelei USER_CONSTRAINTS.
Exemplul de mai sus afiseaza toate constrângerile tabelei EMP.
CONSTRAINT_NAME COLUMN_NAME
EMP_DEPTNO_FK DEPTNO
EMP_EMPNO_PK EMPNO
EMP_MGR_FK MGR
SYS_C00674 EMPNO
SYS_C00675 DEPTNO
Sumar
10
Probleme propuse
Probleme
CONSTRAINT_NAME C
DEPARTEMENT_ID_PK P
EMPLOYEE_ID_PK P
EMPLOYEE_DEPT_ID_FK R
11