Sunteți pe pagina 1din 11

INCLUDEREA CONSTRÂNGERILOR

Constrângerile previn introducerea de date invalide în tabel.


Utilizarea constrângerilor are ca efect:
- forțează regulile la nivel de tabel atunci când este inserat, actualizat sau șters un rând
din tabel; operația este încheiată cu succes dacă este respectată constrângerea
- previne ștergerea unui tabel dacă există dependențe din alte tabele.

Constrângerile de integritate a datelor


Constrângere Descriere
NOT NULL Specifică faptul că această coloană nu poate conține o
valoare nulă.
UNIQUE Key Specifică o coloană sau o combinație de coloane a căror
valoare trebuie să fie unică pentru toate înregistrările
tabelului.
PRIMARY KEY Identifică unic fiecare înregistrare
FOREIGN KEY Stabilește și forțează o relație de tip cheie externă dintre
coloana respectivă si o coloană din tabelul referit.
CHECK Specifică o condiție care trebuie să fie adevărată.

Se poate crea o constrângere:


- în timpul creării tabelului
- după ce tabelul a fost creat
Constrângerile pot fi definite la nivel de coloană sau de tabel.
Toate constrângerile pot fi vizualizate în dicționarul de date (în care sunt înscrise)
USER_CONSTRAINTS.

Definirea constrângerilor

Sintaxa

CREATE TABLE [schema] tabel


( coloană tip_date [DEFAULT expresie]
[constrângere_coloană],
………
[constrângere_tabel]);

De exemplu, pentru tabelul angajați,

CREATE TABLE ang


( matricol NUMBER(5),
a_nume VARCHAR2(20),
………
nr.dept NUMBER(2) NOT NULL,
CONSTRAINT ang_matricol_pk
PRIMARY KEY(matricol));

1
Toate constrângerile sunt cuprinse într-un dicționar. Este ușor să se facă referință la constrângeri
dacă li se dau nume sugestive. Numele unei constrângeri trebuie să urmeze un anumit standard.
Dacă nu se denumește constrângerea, serverul Oracle generează un nume de forma SYS_Cn,
unde n este un număr întreg astfel încât numele constrângerii este unic.
Constrângerile definite pentru un anumit tabel pot fi vizualizate în USER_CONSTRAINTS
(dicționarul tabelului).
De obicei, constrângerile sunt create în același timp cu tabelul, dar pot fi și adăugate tabelului
după crearea lui.
Constrângerile pot fi definite pe două nivele:
 Coloană - Face referire la o singură coloană; poate defini orice tip de constrângere de
integritate
 Tabel - Face referire la una sau mai multe coloane; poate defini orice constrângere,
exceptând pe cea de tip NOT NUL.

Sintaxa
1. Constrângere la nivel de coloană

coloană [CONSTRAINT nume_constrângere] tip_constrângere

2. Constrângere la nivel de tabel

coloană,..
[CONSTRAINT nume_constrângere] tip_constrângere
(coloană,...),

Constrângerea NOT NULL

Constrângerea NOT NULL ne asigură că valorile null nu sunt permise în coloana respectivă.
Coloanele fără constrângerea NOT NULL pot conține, implicit, valori null.

ang
A_NUME DATA_ANGAJARE SALARIU BONIFICAȚIE POST MATRICOL NR.DEPT
IONESCU 11 IAN 2000 5500 INGINER 1489 1
POPESCU 18 NOV 2011 1550 INGINER 7852 1
VASILESCU 23 AUG 2011 1800 ECONOMIST 2598 2
ANDRONACH 1 MAI 2017 2250 ECONOMIST 12358 3
E
GEORGESCU 2 SEPT 2000 3500 AGENT 2466 4
VÂNZĂRI
TACHE 22 IUL 2015 1450 ECONOMIST 1587 2
IONESCU 25 AUG 1999 4520 INGINER 675 3

Constrângere NOT NULL Absența constrângerii NOT Constrângere


(nicio înregistrare nu NULL (orice înregistrare NOT NULL
poate conține o valoare poate conține null pentru
NULL pe această coloană) această coloană)

2
Constrângerea NOT NULL definită la nivel de coloană

SQL> CREATE TABLE ang


(
a_nume VARCHAR2(10) NOT NULL
data_angajare DATE
salariu NUMBER(7)
bonificație NUMBER(7)
post VARCHAR2(9)
matricol NUMBER(4)
nr.dept NUMBER(2) NOT NULL
);

Constrângerea NOT NULL poate fi specificată numai la nivel de coloană.


În exemplul de mai sus, se aplica constrângerea NOT NULL coloanelor a_nume si nr.dept
pentru tabelul ang.
Deoarece aceste constrângeri nu au nume, Oracle Server va crea nume pentru ele.
Numele constrângerii poate fi specificat în timpul specificării constrângerilor:

… nr.dept NUMBER(7,2)
CONSTRAINT ang_nr.dept_nn NOT NULL …

Constrângerea UNIQUE Key (cheie unică)

constrângere UNIQUE key

dept
nr.dept numedept localitate
1 cercetare București
2 operațiuni Timișoara
3 conturi Cluj
4 vânzări Iași

inserare
5 conturi Constanța
6 Craiova nu este permisă, există numedept conturi
permisă

O constrângere de integritate cheie unică cere ca fiecare valoare din coloana sau set de
coloane să fie unică – două înregistrări ale tabelului nu pot avea valori duplicat în coloana sau
setul de coloane care formează constrângerea. Coloana (setul de coloane) inclusă în definiția
cheii unice se numește cheie unică. Dacă cheia unică conține mai multe coloane se numește
cheie unică compusă.
Constrângerea cheie unică permite introducerea de valori null dacă nu a fost definită o
constrângere NOT NULL pentru acea coloană.

3
Orice număr de înregistrări pot include valori null în coloane fără constrângerea NOT
NULL.
O valoare null într-o coloană (sau în toate coloanele unei chei unice compuse)
întotdeauna satisface o constrângere de cheie unică.

Constrângerea cheie unică (unique key) definită la nivel de tabel sau coloană

SQL> CREATE TABLE dept


(
nr.dept NUMBER(2)
numedept VARCHAR2(14)
localitate VARCHAR2(13)
CONSTRAINT dept_numedept_uk UNIQUE(numedept)
);

Constrângerile de cheie unică pot fi definite la nivel de coloană sau tabel.


O cheie unică compusă este creată utilizând definiția la nivel de tabel.
În exemplu, se aplică constrângerea de cheie unică coloanei numedept din tabela dept.
Numele constrângerii este dept_numedept_uk.

Constrângerea PRIMARY KEY

constrângere PRIMARY KEY

nr.dept numedept localitate


1 cercetare București
2 operațiuni Timișoara
3 conturi Cluj
4 vânzări Iași

inserare
3 marketing Constanța nu este permisă, există nr.dept 3
relații publice Craiova nu este permisă, deoarece nr.dept e NULL

Constrângerea de cheie primară creează o cheie primară pentru fiecare tabel.


Pentru fiecare tabel poate fi creată numai o cheie primară.
Constrângerea de cheie primară este o coloană sau set de coloane care identifică unic
fiecare înregistrare din tabel. Această constrângere forțează unicitatea coloanei sau a setului de
coloane și asigură că nicio coloană care este parte a cheii primare nu poate conține o valoare
null.

4
Constrângerea cheii primare definită la nivel de coloană sau tabel

SQL> CREATE TABLE dept


(
nr.dept NUMBER(2)
numedept VARCHAR2(14)
localitate VARCHAR2(13)
CONSTRAINT dept_numedept_uk UNIQUE(numedept)
CONSTRAINT dept_nr.dept_pk PRIMARY KEY(nr.dept)
);
Constrângerea cheie primară (PRIMARY KEY) poate fi definită la nivel de tabel sau
coloană. O cheie primară compusă este creată utilizând definiția la nivel de tabel.
Exemplul definește o cheie primară după coloana nr.dept a tabelei dept. Numele
constrângerii este dept_nr.dept_pk.

Constrângerea FOREIGN KEY

PRIMARY KEY dept


nr.dept numedept localitate
1 cercetare București
2 operațiuni Timișoara
3 conturi Cluj
4 vânzări Iași
FOREIGN KEY

ang
A_NUME DATA_ANGAJARE SALARIU BONIFICAȚIE POST MATRICOL NR.DEPT
IONESCU 11 IAN 2000 5500 INGINER 1489 1
POPESCU 18 NOV 2011 1550 INGINER 7852 1
VASILESCU 23 AUG 2011 1800 ECONOMIST 2598 2
ANDRONACH 1 MAI 2017 2250 ECONOMIST 12358 3
E
GEORGESCU 2 SEPT 2000 3500 AGENT 2466 4
VÂNZĂRI
TACHE 22 IUL 2015 1450 ECONOMIST 1587 2
IONESCU 25 AUG 1999 4520 INGINER 675 3

inserare
nu este permisă, nu există nr.dept 7 în tabelul dept

A_NUME DATA_ANGAJARE SALARIU BONIFICAȚIE POST MATRICOL NR.DEPT


Claudiu 15.oct.2017 1950 ECONOMIST 5555 7
Vasile 15.oct.2017 1950 ECONOMIST 5556

permisă

5
Cheia externă, sau constrângerea de integritate referențială, desemnează o coloană sau o
combinație de coloane în funcția de cheie externă și stabilește o relație cu o cheie primară sau o
cheie unică în același tabel sau un tabel diferit.
În exemplu, nr.dept a fost definit cheie externă în tabelul ang (dependent sau tabel copil); ea
referă coloana nr.dept din tabelul dept (referit sau tabel părinte).
Valoarea unei chei externe trebuie să se potrivească cu o valoare existentă în tabelul părinte
sau să fie NULL.

Constrângerea cheii externe definită la nivel de coloană sau tabel

SQL>CREATE TABLE ang


(
a_nume VARCHAR2(10) NOT NULL
data_angajare DATE
salariu NUMBER(7)
bonificație NUMBER(7)
post VARCHAR2(9)
matricol NUMBER(4)
nr.dept NUMBER(2) NOT NULL CONSTRAINT ang_nr.dept_fk
CONSTRAINT ang_nr.dept_fk FOREIGN KEY (nr.dept)
REFERENCES dept (nr.dept)
);

Constrângerile cheii externe pot fi definite la nivelul constrângerilor de tabel sau de coloană.
O cheie externă compusă este creată folosind definițiile la nivel tabel.
Exemplul de mai sus definește o constrângere de tip cheie externă în coloana nr.dept din
tabela ang. Numele constrângerii este ang_nr.dept_fk.

Definirea cheii externe la nivel de coloană:

SQL>CREATE TABLE ang


(
a_nume VARCHAR2(10) NOT NULL
data_angajare DATE
salariu NUMBER(7)
bonificație NUMBER(7) constrângere
post VARCHAR2(9) pentru coloană
matricol NUMBER(4)
nr.dept NUMBER(2) NOT NULL
CONSTRAINT ang_nr.dept_fk REFERENCES dept (nr.dept)
); constrângere
pentru tabel

Cuvinte cheie ale constrângerii FOREIGN KEY


 FOREIGN KEY – definește coloana în tabelul copil la nivelul constrângerii de
tabel.
 REFERENCES - identifică tabelul părinte și coloana în tabelul părinte.
 ON DELETE CASCADE indică faptul că, atunci când rândul din tabelul părinte
va fi șters, rândul dependent din tabelul copil va fi de asemenea șters.

6
 ON DELETE SET NULL convertește valorile foreign key în valori nule atunci
când valoarea părinte este ștearsă.

Constrângerile externe sunt definite în tabelul copil  și tabelul care conține coloana la care se
face referință devine părinte.
Fără opțiunea ON DELETE CASCADE, rândul din tabelul părinte nu va putea fi șters dacă
este referit în tabelul copil.

Constrângerea CHECK - Constrângerea de verificare

 Definește o condiție pe care fiecare rând trebuie să o îndeplinească.

Sintaxa:

…., nr.dept NUMBER(2),


CONSTRAINT ang_nr.dept_ck
CHECK (nr.dept BETWEEN 1 AND 99)….

Constrângerile de verificare pot fi definite la nivel de coloana sau la nivel de tabel.

Pentru tabelul pers se poate impune o constrângere de tip check la nivelul vârstei (pentru a fi
angajat, trebuie să fii major).
pers
nume matricol nr.depr vârsta copii pasiuni
Ionescu 1489 1 25 1 citit
Popescu 7852 1 39 2 scris
Vasilescu 2598 2 45 1 ascultat
Andronache 12358 3 34 1 vorbit
Georgescu 2466 4 62 3 mancare
Tache 1587 2 40 0 bautura
Iancu 675 5

De aceea, la crearea tabelului, se poate impune această condiție:

CREATE TABLE pers


(
nume VARCHAR2(10)
matricol NUMBER(5)
nr.dept NUMBER(2)
vârsta NUMBER(2) CHECK (vârsta >= 18)
copii NUMBER(2)
pasiuni VARCHAR2(10)
);

Cu această restricție, următoarea inserare

INSERT INTO pers


Values (’Codreanu’, 12400, 2 , 27 , 1);

se va termina cu succes:
1 row(s) affected

7
iar inserarea

INSERT INTO pers


Values (’Codrescu’, 12401, 2 , 17 , 0);

se va termina cu eșec:

Msg 547, Level 16, State 0, Line 13


The INSERT statement conflicted with the CHECK constraint ....
The statement has been terminated.

Acțiuni privind constrângeri în tabele existente

Acțiuni posibile după crearea unui tabel:


 Se poate adăuga, scoate, activa, dezactiva o constrângere, dar nu se poate modifica
structura acesteia.
 Se poate adăuga o constrângere de tip NOT NULL la o coloană existentă folosind clauza
MODIFY din funcția ALTER TABLE.

Adăugarea unei constrângeri

Se poate adăuga o constrângere la tabelele existente, folosind declarația ALTER TABLE


împreună cu clauza ADD.
Sintaxa:

ALTER TABLE tabel


ADD [ CONSTRAINT constrângere] tip_constrângere (coloană);

Observație:
Denumirea constrângerii este opțională, dar recomandată. Dacă nu se dă nume
constrângerilor, sistemul va genera nume implicit SYS_Cn .

Exemplu: Se doreşte ca pe coloana nume a tabelului pers să nu existe valori nule sau identice
şi lungimea minimă să fie de 6 caractere:

ALTER TABLE pers


ADD CONSTRAINT nume_nenul_ck CHECK(nume IS NOT NULL);
ALTER TABLE pers
ADD CONSTRAINT nume_unic_uk UNIQUE(nume);
ALTER TABLE pers
ADD CONSTRAINT nume_6_ck CHECK(LENGTH(nume)>5);

Ștergerea unei constrângeri


Pentru a șterge o constrângere, se va utiliza declarația ALTER TABLE cu clauza DROP.
Opțiunea CASCADE a clauzei DROP face să fie ștearsă și constrângerea dependentă.

Sintaxa generală:
ALTER TABLE tabel
DROP PRIMARY KEY| UNIQUE (coloană)|CONSTRAINT nume_constrângere
[CASCADE];

8
Defalcat:
ALTER TABLE tabel
DROP PRIMARY KEY [CASCADE];

ALTER TABLE tabel


DROP UNIQUE(listă_coloane) [CASCADE];

ALTER TABLE tabel


DROP CONSTRAINT nume [CASCADE

Efectul acestor cereri este:


 DROP PRIMARY KEY şi DROP UNIQUE specifică ştergerea constrângerii de tip
cheie primară/cheie unică pentru tabelul respectiv. Constrângerea poate să nu aibă un
nume asociat la definire.
 DROP CONSTRAINT specifică ştergerea unei constrângeri având asociat un nume.
 Opţiunea CASCADE se aplică în cazul în care există constrângeri dependente şi
specifică ştergerea suplimentară a acestora.

Exemplu:
Eliminarea constrângerii de tip cheie primară din tabelul dept precum și eliminarea
constrângerii externe asociate la coloana ang-nr.dept.

SQL>ALTER TABLE dept


DROP PRIMARY KEY CASCADE;

Table altered.

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


USER_CONSTRAINS și USER_CONS_COLUMNS. Apoi se folosește funcția ALTER TABLE
împreună cu clauza DROP. Opțiunea CASCADE din clauza DROP are ca efect și scoaterea
tuturor constrângerilor dependente.

ALTER TABLE ang


DROP CONSTRAINT ang_nr.dept_fk;

Dezactivarea constrângerilor
Dezactivarea constrângerii se efectuează cu declaraţia ALTER TABLE însoţită de clauza
DISABLE.
Sintaxa:

ALTER TABLE tabel


DISABLE CONSTRAINT constrângere [CASCADE];

 Clauza DISABLE din funcția ALTER TABLE dezactivează o constrângere de integritate.


 Opțiunea CASCADE dezactivează constrângeri de integritate dependente.

Exemplu:

ALTER TABLE dept


DISABLE CONSTRAINT nr.dept_pk CASCADE

9
Table altered.

Clauza DISABLE se poate folosi atât în funcția CREATE TABLE cât și în funcția ALTER
TABLE.
Clauza CASCADE dezactivează constrângerile de integritate dependente.

Activarea constrângerilor

Activarea unei constrângeri de integritate care este dezactivată se face utilizând ALTER
TABLE cu clauza ENABLE..

Sintaxa:
ALTER TABLE tabel
ENABLE CONSTRAINT nume_constrângere [CASCADE];

Exemplu (reactivare constrângere de cheie primară):

ALTER TABLE dept


ENABLE CONSTRAINT nr.dept_pk CASCADE

Table altered.

 Dacă se activează o constrângere, constrângerea este aplicată tuturor datelor din tabel.
Toate datele din tabel trebuie să îndeplinească condițiile din constrângere.
 Dacă se activează o constrângere de tip unic sau cheie primară, atunci este creat în mod
automat un index de tip unic.
 Clauza ENABLE se poate folosi atât în funcția CREATE TABLE cât și în funcția ALTER
TABLE.

Vizualizarea constrângerilor

După crearea unui tabel, se poate confirma existența sa prin folosirea comenzii DESCRIBE.
Singura constrângere care poate fi verificată în această situație este constrângerea NOT NULL.
Pentru a vedea toate constrângerile din tabel, este necesară interogarea tabelului
USER_CONSTRAINTS.
Interogarea tabelului USER_CONSTRAINTS pentru a putea vedea toate numele și definițiile
constrângerilor se face în modul următor:

SQL> SELECT constraint_name, constraint_type, search_condition


FROM user_constraints
WHERE table_name=’ang’;
Rezultat posibil:

CONSTRAINT_NAME C SEARCH_CONDITION
SYS_C00674 C A_NUME IS NOT NULL
SYS_C00675 C NR.DEPT IS NOT NULL
ANG_MATRICOL_PK P

10
Constrângerilor care nu primesc un nume de la posesorul tabelei, li se atribuie un nume
automat de către sistem. La tipul constrângerii, C provine de la CHECK, P de la PRIMARY
KEY, R de la integritate referențială și U de la UNIQUE. De observat faptul că constrângerea
NOT NULL este o constrângere de tip CHECK.

Vizualizarea coloanelor asociate constrângerilor

Vizualizarea coloanelor asociate cu numele constrângerilor se face în tabelul


USER_CONS_COLUMNS.

Interogarea acestui tabel:

SQL> SELECT constraint_name, column_name,


FROM user_cons_columns
WHERE table_name=’ang’;

CONSTRAINT_NAME COLUMN_NAME
ANG_NR.DEPT_FK NR.DEPT
ANG_MATRICOL_PK MATRICOL
SYS_C00675 NR.DEPT

Se pot vizualiza numele coloanelor implicate în constrângeri interogând dicționarul


USER_CONS_COLUMNS. Aceasta vizualizare este utilă mai ales în cazul constrângerilor
asociate de către sistem.

11

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