Sunteți pe pagina 1din 16

Platform de e-learning i curricul e-content

pentru nvmntul superior tehnic

Proiect nr. 154/323 cod SMIS 4428 cofinanat de prin Fondul European de
Dezvoltare Regional Investiii pentru viitorul dumneavoastr.

Programul Operaional Sectorial Creterea Competitivitii Economice - POS CCE

Platform de e-learning i curricul e-content


pentru nvmntul superior tehnic

Baze de date

17. Constrngeri asupra bazelor de date. Erori posibile

Introducere
Comenzile pentru crearea i definirea de structuri tabelare sunt comenzi
de definire a datelor (Data Definition Language DDL) i permit crearea, dar
i relaionarea lor ntr-o baz de date.
Structura unei tabele este dat de urmtoarele specificaii de definire:
definirea coloanelor
definirea constrngerilor de integritate
definirea tablespace-lui unde se creeaz
definirea parametrilor
Constrngerile de integritate reprezint anumite reguli de funcionare, care
trebuie respectate la nivel de tabel, sau n relaiile cu alte tabele. Aceste reguli
sunt verificate automat, n cazul operaiilor de inserare, stergere sau
modificare i n cazul n care nu se valideaz, sistemul de gestiune genereaz
o eroare i tranzacia nu se efectueaz.

Tipuri de constrngeri de integritate


n Oracle, constrngerile de integritate pot fi :
NOT NULL nregistrrile nu pot conine valori nule
UNIQUE definete o cheie unic pe una sau mai multe coloane ( nu pot fi
mai multe nregistrri cu aceleai valori pe coloanele respective)
PRIMARY KEY definete o cheie primar la nivel de coloan sau tabel ( nu
pot fi mai multe nregistrri cu aceeai cheie primar).
FOREIGN KEY definete o cheie extern ( tabela relaioneaz cu alt tabel,
pe o cheie unic sau cheie primar)
CHECK foreaz o condiie pe coloan

Caracteristicile constrngerilor de integritate


Fiecare constrngere va avea un nume dat de user, sau generat
de sistem;
Constrngerile pot fi activate sau dezactivate cu comanda ALTER
TABLE;
Constrngerile pot fi adugate sau terse i dup crearea
tabelului;
Informaiile legate de constrngeri se pstreaz n dicionarul
bazei de date;

Violarea unei constrngeri genereaz o eroare de sistem.

Constrngerea NOT NULL


Se aplic numai la nivel de coloane i verific dac nregistrrile au valori nule
pe coloanele respective, fornd un cod de eroare care anuleaz tranzacia;
Cnd se creeaz constrngeri pe o cheie primar, se creeaz automat i o
costrngere NOT NULL pe coloanele respective ( o cheie primar nu trebuie s
conin valori nule pe coloanele care o definesc).
Sintaxa la nivel de coloan este :

column_name [ CONSTRAINT constraint_name ] NOT NULL


unde
column_name este numele unei coloane din tabel;
constraint_name este numele constrngerii.

Exemplu:

S crem un tabel pentru tipurile de funcii ntr-o companie:


SQL>CREATE TABLE functii
( cod_functie number(2) CONSTRAINT NL NOT NULL,
den_functie varchar2(20) NOT NULL,
data_vigoare date );

Funcionalitatea coloanelor cod_functie i den_functie este aceeai (nu


accept valori nule), dar construcia constrngerii pentru cod_functie
permite activarea sau dezactivarea constrngerii NL.

Constrngerea UNIQUE
Se folosete cnd vrem ca o coloan, sau perechi de coloane, s nu conin
valori duplicate. Verificarea se face numai pentru nregistrri cu valori nenule,
deoarece constrngerea permite inserarea de valori nule n coloanele
respective.
n mod automat, se creeaz i un index pe coloanele definite cheii unice, ceea
ce duce la mrirea vitezei de interogare pe tabel.

Sintaxa la nivel de coloan este:


column_name [ CONSTRAINT constraint_name ] UNIQUE
Sintaxa la nivel de tabel este:
[, CONSTRAINT constraint_name ] UNIQUE (col1, col 2,..)

Exemplu:
S crem tabela functii definind unicitate pe anumite coloane:
SQL>CREATE TABLE functii
( cod_functie number(2) CONSTRAINT UK_FUN UNIQUE,
den_functie varchar2(20) UNIQUE,
data_vigoare date ) ;
Putem s facem i urmtoarea construcie la nivel de tabel:

SQL>CREATE TABLE functii


( cod_functie number(2),

den_functie varchar2(20),
data_vigoare date,

CONSTRAINT UK_FUN UNIQUE (cod_functie,den_functie) );


n prima construcie, putem insera oricte nregistrri cu valori nule pe coloanele
definite unice, dar n construcia a doua, nu putem s inserm nregistrri cu una
dintre coloane nul i cealalt s nu respecte unicitatea.

Constrngerea PRIMARY KEY


Se folosete pentru definirea cheii primare la nivel de coloan (cnd cheia
conine o singur coloan) sau la nivel de tabel ( cnd cheia este compus pe
mai multe coloane). Un tabel poate avea o singur cheie primar i nu
accept valori nule pentru nicio coloan care o definesc. Cnd se creeaz o
cheie primar, se creeaz n mod automat i un index pentru a scurta timpul
de rspuns n cazul unei interogri.
Sintaxa la nivel de coloan este:

column [ CONSTRAINT constraint_name ] PRIMARY KEY


Sintaxa la nivel de tabel este:

[, CONSTRAINT constraint_name ] PRIMARY KEY (col1, col 2,..)

Exemplu:
Dac vrem s crem un nomenclator de funcii, n care fiecare funcie s aib
cod unic, folosim urmtoarea construcie :
SQL>CREATE TABLE functii
( cod_functie number(2) CONSTRAINT PK PRIMARY KEY,
den_functie varchar2(20),
data_vigoare date );
Cnd dorim ca un cod de funcie s poat fi utilizat de mai multe ori, trebuie
s definim cheia pe mai multe coloane, de exemplu pe codul funciei i data la
care intr n vigoare codificarea, folosind construcia:
SQL>CREATE TABLE functii
( cod_functie number(2) ,
den_functie varchar2(20),
data_vigoare date,
CONSTRAINT PK_FUN PRIMARY KEY (cod_functie,data_vigoare) )

Constrngerea FOREIGN KEY


Acest tip de constrngere se folosete pentru relaionarea unui tabel cu unul sau mai
multe tabele, verificnd dac valorile coninute n coloanele definite de FOREIGN KEY
( cheie strin sau cheie extern) sunt cuprinse n valorile coloanelor altei tabele care
trebuie s fie definite UNIQUE sau PRIMARY KEY. Mai exact, o relaionare pe cheie
extern se poate face numai pe o cheie primar sau unic .
Sintaxa la nivel de coloan este:
column [ CONSTRAINT constraint_name ]
REFERENCES table(column)
[ ON DELETE CASCADE|ON DELETE SET NULL ]

Sintaxa la nivel de tabel este:


column [ CONSTRAINT constraint_name ]
FOREIGN KEY ( col1, col2, ...)
REFERENCES table(col1, col2, ..)
[ ON DELETE CASCADE|ON DELETE SET NULL ]

Exemplu:
Dac vrem s crem tabelul angajati i s o relaionm cu tabelele departamente i
funcii, trebuie s facem urmtoarea construcie la nivel de coloan:

SQL>CREATE TABLE angajati


( id_ang
number(4)
nume
functie

PRIMARY KEY,

varchar2(30),
varchar2(20) REFERENCES functii(den_functie),

id_sef
number(4)
data_ang date,

REFERENCES angajati(id_ang),

salariu
number(7,2),
comision number(7,2),
id_dep
number(2) REFERENCES departamente(id_dep) );
Pentru a se putea face relaionarea, trebuie ca tabela functii s aib cheie primar sau
unic pe coloana den_functie, iar tabela departamente s aib cheie primar sau unic
pe coloana id_dep. Se observ c tabelul este relaionat cu el nsui dup coloanele
id_sef i id_ang.

Reguli de funcionare
Cnd se face relaionarea ntre dou tabele, trebuie avute n vedere
urmtoarele reguli de funcionare :
Inserarea unei linii ntr-un tabel relaionat (pe care am definit FOREIGN KEY)
nu se poate face dac nu exist dect o singur linie n tabelul de referin
( n care am definit PRIMARY KEY sau UNIQUE) corespunztor coloanelor de
relaionare;
tergerea unei linii din tabelul de referin nu se poate face atta timp ct
exist linii relaionate pe linia respectiv n tabelul relaionat;
Dac s-a folosit optiunea ON DELETE CASCADE, se poate terge o linie din
tabelul de referin, dar se terg automat toate liniile relaionate pe linia
respectiv, din toate tabelele relaionate;
n cazul unui tabel relaionat cu el nsui, cnd se terge o linie, care este
referit, toate coloanele devin nule n liniile relaionate;
Regulile de mai sus sunt valabile i n cazul relaionrii pe coloane.

Constrngerea CHECK

Acest tip de constrngere se folosete pentru a fora valorile


unei coloane s verifice o condiie. Condiia poate s conin i
funcii, cu unele excepii( sysdate, user, unele functii de tip data
calendaristica e.t.c).
Sintaxa la nivel de coloan este:

column [ CONSTRAINT constraint_name ] CHECK ( expr)


Sintaxa la nivel de tabel este:
[, CONSTRAINT constraint_name ] CHECK (expr)

Exemplu:
Dac vrem ca n tabelul angajati, numele angajailor s fie nregistrate numai
cu litere mari, salariul s fie mai mare dect zero, iar comisionul s nu
depeasc salariul, folosim constrngerea CHECK :
SQL>CREATE TABLE angajati
( id_ang
number(4) PRIMARY KEY,
nume
varchar2(30) CONSTRAINT CK_NU CHECK(nume=UPPER(nume),
functie
varchar2(20) REFERENCES functii(den_functie),
id_sef
number(4) REFERENCES angajati(id_ang),
data_ang date,
salariu
number(7,2) CHECK (salariu>0),
comision number(7,2),
id_dep
number(2)
REFERENCES departamente(id_dep),
CONSTRAINT CK_COM CHECK (comision <= salariu) );

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