Sunteți pe pagina 1din 11

INCLUDEREA CONSTRÂNGERILOR

OBIECTIVE

Dupa parcurgerea acestei lectii, ar trebuii sa stii sa faci urmatoarele:


 Sa descrii constrângerile
 Sa creezi si sa actualizezi constrângerile

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.

Constrângerile de integritate a datelor


Constrângere Descriere
NOT NULL Specifica ca aceasta coloana nu poate contine o valoare nula.
UNIQUE Key Specifica o coloana sau o combinatie de coloane a caror
valoare trebuie sa fie unica pentru toate inregistrarile tabelei.
PRIMARY KEY Identifica unic fiecare inregistrare
FOREIGN KEY Stabileste si forteaza o relatie de tip cheie externa dintre
coloana si o coloana din o tabela referita.
CHECK Specifica o conditie care trebuie sa fie adevarata.

Ghid pentru crearea constrângerilor


 Constrângerile trebuie sa aiba un nume sau serverul Oracle va genera un nume utilizând
formatul SYS_Cn
 Se poate creea o constrângere:
- în timpul crearii tabelei
- dupa ce tabela a fost creata
 Defineste o constrângere la nivel de coloana sau de tabela.
 Vizualizeaza constrângerea în dictionarul de date.
Toate constrângerile sunt pastrate în dictionarul de date. Constrângerile sunt simplu de referit
daca daca li se da un nume sugestiv. Constrâmgerile trebuie sa urmeze regulile standard de
denumire a obiectelor. Daca constrângerea nu are un nume, Oracle genereaza un nume dupa
formatul SYS_Cn, unde n este un întreg crea sa creeze un nume unic.
Constrângerile pot fi definite la crearea tabelei sau dupa ce tabela a fost creata.

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]);

CREATE TABLE emp(


empno NUMBER(4),
ename VARCHAR(2),
………
deptno NUMBER(7,2) NOT NULL,
CONSTRAINT emp_empno_pk PRIMARY
KEY(EMPNO));

Î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

 Constrângere la nivel de coloana


column [CONSTRAINT constraint_name] constraint_type,
 Constrângere la nivel de tabela
column , ……
[CONSTRAINT constraint_name] constraint_type
(column, ……),
Constrângerile sunt de obicei create în acelasi timp cu tabela. Ele pot fi adaugate si dupa
crearea tabelei.
Constrângerile pot fi definite la unul din urmatoarele doua nivele:

Constraint level Descriere


Column Refera o singura coloana si poate defini orice tip de constrângere
Table Refera una sau mai multe coloane si este definita separat de definitiile coloa-
nelor în tabela: poate defini orice tip de constrângere exceptând NOT NULL

În sintaxa:
constrain_name este numele constrângerii
constraint_type este tipul constrângerii

Constrângerea NOT NULL

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

Constrângere NOT NULL Absenta constrângerii NOT Constrângere NOT


(nici o înregistrare nu NULL (orice înregistrare NULL
poate contine o valoare poate contine null pentru
NULL pe aceasta coloana) aceasta coloana)

Constrângerea NOT NULL ne asigura ca valori null nu sunt permise în coloana.


Coloanele fara constrângerea NOT NULL pot contine implicit valori null.

Constrângerea NOT NULL definita la nivel de coloana

SQL> CREATE TABLE emp(


empno NUMBER(4)
ename VARCHAR2(10) NOT NULL
job VARCHAR2(9)
mgr NUMBER(4)
hiredate DATE
sal NUMBER(7,2)
comm NUMBER(7,2)
deptno NUMBER(7,2) NOT NULL);

Constrângerea NOT NULL poate fi specificata numai la nivel de coloana.


În exemplul de mai sus se aplica constrângerea NOT NULL coloanelor ENAME si DEPTNO
pentru pabela EMP. Deoarece aceste constrângeri nu au nume, Oracle Server va crea nume
pentru ele.
Numele constrângerii poate fi specificat în timpul specificarii constrângerilor.
… deptno NUMBER(7,2)
CONSTRAINT emp_deptno_nn NOT NULL …
Nota: toate constrângerile descrise în aceasta lectie pot sa nu fie prezente în exemplele de
tabele furnizate împreuna cu acest curs. Daca se doreste, ele pot fi adaugate.

Constrângerea UNIQUE Key

UNIQUE key constraint


DEPT
DEPTNO DNAME LOC

3
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

Insert into

50 SALES DETROIT
60 BOSTON Allowed

Not allowed ( DNAME-


SALES exista deja)

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

SQL> CREATE TABLE dept(


deptno NUMBER(2)
dname VARCHAR(14)
loc VARCHAR(13)
CONSTRAINT dept_dname_uk UNIQUE(dname));
Constrângerile de cheie unica pot fi definite la nivel de coloana sau tabela. O cheie unica
compusa este creata utilizând definitia la nivel de tabela.
În exemplu se aplica constrângerea de cheie unica coloanei DNAME din tabela DEPT.
Numele constrângerii este DEPT_DNAME_UK.

Nota: Serverul Oracle forteaza implicit constrâgerea de cheie unica creând


un index unic dupa cheia unica.

Constrângerea PRIMARY KEY

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.

Constrângerea cheii primare definita la nivel de coloana sau tabela

SQL> CREATE TABLE dept(


deptno NUMBER(2),
dname VARCHAR2(14),
loc VARCHAR2(13),
CONSTRAINT dept_dname_uk UNIQUE (dname),
CONSTRAINT dept_deptno_pk PRIMARY KEY(deptno));
Constrângerea cheie primara (PRIMARY KEY) poate fi definita la nivel de tabela sau
coloana. O cheie primara compusa este creata utilizând definitia la nivel de tabela.
Exemplul defineste o cheie primara dupa coloana DEPTNO a tabelei DEPT. Numele
constrângerii este DEPT_DEPTNO_PK.
Nota: un index unic este automat creat pentru o coloana cheie primara.

Constrângerea FOREIGN KEY

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

7571 FORD MANAGER 200 9


7571 FORD MANAGER 200

Not allowed (DEPTNO=9 nu Allowed


exista în tabela DEPT)

Cheia externa sau constrângerea de integritate referentiala, desemneaza o coloana sau o


combinatie de coloane in functia de cheie externa si stabileste o relatie cu o cheie primara sau o
cheie unica în aceeasi tabela sau o tabela diferita. În exemplu, DEPTNO a fost definit cheie
externa în tabela EMP (dependenta sau tabela copil); ea refera coloana DEPTNO din tabela
DEPT (referita sau tabela parinte).
Valoarea unei chei externe trebuie sa se potriveasca cu o valoare existenta în tabela parinte
sau sa fie NULL.
Obs: Cheile externe sunt bazate pe valorile datelor si sunt pointeri pur logici, nu fizici.

Constrângerea cheii externe definita la nivel de coloana sau tabela


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_detpno_fk FOREIGN KEY (deptno)
REFERENCES dept (deptno));

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.

Cuvintele cheie ale constângerii FOREIGN KEY


 FOREIGN KEY
Defineste coloana în tabela copil la nivelul constângerii de tabel.
 REFERENCES
Identifica tabela si coloana în tabela parinte.
 ON DELETE CASCADE
Permite stergeri în tabela parinte precum si stergeri de linii independente în tabela copil.

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

 Defnieste o conditie pe care fiecare rând trebuie sa o îndeplineasca.


 Expresii care nu sunt permise:
- Referiri la pseudocoloanele CURRVAL, NEXTVAL, LEVEL, and ROWID
- Apeluri la functiile SYSDATE, UID, USER, and USERENV
- Interogari care fac referinte la alte valori din alte rânduri.

…., deptno NUMBER(2),


CONSTRAINT emp_deptno_ck
CHECK (DEPTNO BETWEEN 10 AND 99)….

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

ALTER TABLE table


ADD [ CONSTRAINT constraint] type (column);
 Adauga sau scoate, dar nu modifica o constrângere.
 Activeaza sau dezactiveaza constrângeri.
 Adauga o constrângere de tip NOT NULL folosind clauza MODIFY.
Adaugând o constrângere.
Se poate adauga o constrângere la tabelele existente folosind declaratia ALTER TABLE
împreuna cu clauza ADD.
În sintaxa:
table este numele tabelei
constraint este numele constrângerii
type este tipul constrângerii
column este numele coloanei afectate de 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.

Scoaterea unei constrângeri


 Scoaterea contrângerii manager din tabela EMP.
SQL>ALTER TABLE emp
2 DROP CONSTRAINT emp_mgr_fk;
Table altered.
 Scoaterea contrângerii de tip cheie primara din tabela DEPT precum si scoaterea
contrângerii externe asociate la coloana EMP.DEPTNO.
SQL>ALTER TABLE dept
2 DROP PRIMARY KEY CASCADE;
Table altered.

Pentru a scoate a constrângere, trebuie identificat numele contrângerii folosind


USER_CONSTRAINS si USER_CONS_COLUMNS. Apoi se foloseste functia ALTER TABLE
împreuna cu clauza DROP. Optiunea CASCADE din clauza DROP are ca efect si scoaterea
tuturor constrângerilor dependente.

Sintaxa:
ALTER TABLE table
DROP PRIMARY KEY | UNIQUE (column) |
CONSTRAINT constraint [CASCADE];

Unde: table este numele tabelei


column este numele coloanei afectate de contrângere
constraint este numele contrângerii.
Atentie: Când se scoate o constrângere de integritate, aceasta nu mai este folosita de catre
Oracle Server si nu mai este disponibila în dictionarul de date.

Dezactivarea constrângerilor

 Executarea clauzei DISABLE din functia ALTER TABLE pentru a dezactiva o


constrângere de integritate.
 Aplicarea optiunii CASCADE pentru a dezactiva constrângeri de integritate dependente.
SQL> ALTER TABLE emp
2 DISABLE CONSTRAINT emp_empno_pk CASCADE;
Table altered.

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

Unde: table este numele tabelei


constraint este numele constrângerii.

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;

Unde: table este numele tabelei.


constraint este numele constrâgerii.

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

Interogarea tabelei USER_CONSTRAINTS pentru a putea vedea toate numele si definitiile


constrângerilor.

SQL> SELECT constraint_name, constraint_type,

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.

Nota: Constrângerilor care nu primesc un nume de la posesorul tabelei, li se atribuie un nume


automat de catre sistem. La tipul constrângerii, C provine de la CHECK, P de la PRIMARY
KEY, R de la integritate referentiala, si U de la UNIQUE. De observat faptul ca constrângerea
NULL este de fapt o constrângere de tip CHECK.

Vizualizarea coloanelor asociate constrângerilor

Vizualizarea coloanelor asociate cu numele constrângerilor se face in tabela


USER_CONS_COLUMNS.
SQL> SELECT constraint_name, column_name,
2 FROM user_cons_columns
3 WHERE table_name=’EMP’;

CONSTRAINT_NAME COLUMN_NAME
EMP_DEPTNO_FK DEPTNO
EMP_EMPNO_PK EMPNO
EMP_MGR_FK MGR
SYS_C00674 EMPNO
SYS_C00675 DEPTNO

Se poate vizualiza numele coloanelor implicate în constrângeri interogând dictionarul


USER_CONS_COLUMNS. Aceasta vizualizare este utila mai ales în cazul contrângerilor
asociate de catre sistem.

Sumar

 Crearea umatoarelor tipuri de constrângeri:


- NOT NULL
- UNIQUE key
- PRIMARY KEY
- FOREIGN KEY
- CHECK
 Interogarea tabelei USER_CONSTRAINTS pentru a vizualiza toate numele si
definitiile constrângerilor

10
Probleme propuse

În problemele urmatoare veti adauga constrângeri si coloane aditionale folosind functiile


prezentate în aceasta lectie.

Probleme

1. Adaugati o constrângere de tip PRIMARY KEY la tabela EMPLOYEE folosind coloana


ID. Constrângerea trebuie sa fie activata la creare.

2. Creati o constrângere PRIMARY KEY în tabela DEPARTMENT folosind coloana ID.


Constrângerea trebuie sa fie activata la creare.

3. Adaugati o referinta de tip cheie externa la tabela EMPLOYEE care se va asigura ca


angajatii nu sint asignati la un departament inexistent.

4. Confirmati constrângerile adaugate interogând tabela USER_CONSTRAINTS.Observati


numele si tipul constrângerilor. Salvati textul într-un fisier cu numele p11q4.sql.

CONSTRAINT_NAME C
DEPARTEMENT_ID_PK P
EMPLOYEE_ID_PK P
EMPLOYEE_DEPT_ID_FK R

5. Afisati numele si tipul obiectelor din dictionarul USER_OBJECTS al tabelelor


EMPLOYEE si DEPARTMENT. Formatati coloanele pentru refolosirea lor. Observati ca
a fost creat un nou tabel precum si un nou index.
OBJECT_NAME OBJECT_TYPE
DEPARTMENT TABLE
DEPARTMENT_ID_PK INDEX
EMPLOYEE TABLE
EMPLOYEE_ID_PK INDEX

6. Modificati tabela EMPLOYEE Adaugati o coloana SALARY de tip NUMBER, precizie 7.

11

S-ar putea să vă placă și