Definirea constrngerilor Obiective n aceast lecie vei nva
Definirea constrângerilor
Obiective În această lecție veți învăța : • Să definiți și descrieți constrângerile • Să definiți constrângerile la nivel de tabelă • Să definiți constrângerile la nivel de coloană
Dobândirea cunoștințelor Așa cum am precizat în partea de proiectare a bazelor de date, orice bază de date trebuie să stabilească regulile de integritate care să garanteze că datele introduse sunt corecte și valide. Asta înseamnă că dacă există o regulă sau restricție asupra unei entități, atunci datele introduse în baza de date respectă aceste restricții.
Dobândirea cunoștințelor • Regulile de integritate se definesc la crearea tabelelor folosind constrângerile. • În funcţie de nivelul la care sunt definite avem: - constrângeri la nivel de tabelă care pot acţiona asupra unei combinaţii de coloane - constrângeri la nivel de coloană
Dobândirea cunoștințelor • Constrângerile pot fi clasificate în: - constrângeri de domeniu, care definesc valorile pe care le poate lua un atribut ( NOT NULL, UNIQUE, CHECK) - constrângeri de integritate a tabelei, precizând cheia primară a acesteia - constrângeri de integritate referenţială, care asigură coerenţa între cheile primare şi cheile străine corespunzătoare
Dobândirea cunoștințelor • Orice constrângere într-o bază de date are un nume. Numele îl putem da noi la crearea constrângerii , ca de exemplu clienti_id_client_pk , sau nu și în acest caz sistemul denumește constrângerea, ca de exemplu SYS_C 00585417. • Un mod de a denumi o constrângere este o combinație între numele tabelei, numele coloanei la care se referă și tipul constrângerii(uk, nn, ck, pk, fk): nume-tabelă_nume-coloană_tipul-contrângerii • Este recomandat să denumim noi constrângerile deoarece numele dat de sistem este greu de regăsit.
Dobândirea cunoștințelor Constrângerea NOT NULL Exemplu: • Necompletarea în tabelă a unei celule conduce la completarea ei cu valoarea NULL, semnificând faptul că celula respectivă are de fapt o valoare nedefinită. • Coloanele dintr-o tabelă corespunzătoare atributelor obligatorii din ERD trebuie obligatoriu completate, ele nu pot conţine valoarea NULL. • Pentru definirea acestei restricţii se foloseşte restricţia NOT NULL. • Constrângerile NOT NULL se pot defini doar la nivel de coloană. • Restricţia NOT NULL poate fi folosită împreună cu clauza DEFAULT. • În exemplul de mai jos valoarea câmpului nume nu poate fi NULL, deoarece se va genera o eroare. CREATE TABLE agenti_inchirieri (id_ang NUMBER(5), nume VARCHAR 2(20) NOT NULL, data_ang DATE DEFAULT SYSDATE, salariu NUMBER(5), id_adresa NUMBER(5), id_sef NUMBER(5), data_nast DATE, permis VARCHAR 2(5), comision NUMBER(5))
Dobândirea cunoștințelor Exemplu: CREATE TABLE altii • Aceasta desemnează o coloană sau o combinaţie de coloane ca o cheie unică. (id_ang NUMBER(5), • Două linii în aceeaşi tabelă nu pot avea nume VARCHAR 2(20), aceeaşi valoare pentru această cheie. • Coloanele definite ca UNIQUE pot conţine data_ang DATE, valori NULL, iar acestea pot fi oricâte, adică valoarea NULL este singura valoare ce poate fi salariu NUMBER(5), duplicată într-o coloană UNIQUE, alte valori nu id_adresa NUMBER(5) UNIQUE, pot fi duplicate. • Sintaxa constrângerii la nivel de tabelă: id_sef NUMBER(5), [CONSTRAINT nume constrangere] functia VARCHAR 2(20) , UNIQUE (Coloana, . . . ) CONSTRAINT altii_uk UNIQUE • Sintaxa constrângerii la nivel de coloană: (nume, data_ang)) [CONSTRAINT nume constrangere] Constrângerea UNIQUE
Dobândirea cunoștințelor Constrângere de cheie primară Exemplu: CREATE TABLE inchirieri • Ca şi la cheile unice, o cheie primară ( id_locuinta NUMBER(5), forţează unicitatea unei coloane sau combinaţii de coloane implicate şi un id_client NUMBER(5), index unic este creat pentru a conduce data_preluarii DATE, aceasta. data_predarii DATE, • NULL-urile nu sunt permise în coloanele CONSTRAINT inchirieri_pk PRIMARY de chei primare. KEY(id_locuinta, id_client)) • Sintaxa constrângerii la nivel de tabelă : [CONSTRAINT nume constrangere] PRIMARY KEY (Coloana, . . . ) În exemplul de mai sus s-a definit o constrângere de cheie primară la • Sintaxa constrângerii la nivel de coloană : nivel de tabelă, iar cheia primară [CONSTRAINT nume constrangere] este formată din două câmpuri PRIMARY KEY id_locuinta și id_client. • Aceeaşi combinaţie de coloane nu poate fi folosită şi pentru o cheie primară şi pentru una unică.
Dobândirea cunoștințelor Constrângere de cheie străină • Cheile străine furnizează reguli de integritate de referinţă înăuntrul unei tabele sau între tabele. • O cheie străină este folosită oriunde într-o relaţie cu fiecare cheie primară sau unică. • Sintaxa constrângerii la nivel de tabelă: [CONSTRAINT nume constrangere] FOREIGN KEY (Coloana, . . . ) REFERENCES tabela (Coloana, . . . ) • Sintaxa constrângerii la nivel de coloană: [CONSTRAINT nume constrangere] REFERENCES tabela (Coloana) • Cuvintele 'FOREIGN KEY' nu sunt folosite în cazul constrângerii la nivel de coloană a sintaxei. Exemplu: CREATE TABLE clienti (id_client NUMBER(5) PRIMARY KEY, nume VARCHAR 2(20), id_adresa NUMBER(5) REFERENCES adrese(id_adresa), id_ang NUMBER(5), CONSTRAINT clienti_fk FOREIGN KEY (id_ang) REFERENCES agenti_inchirieri (id_ang))
Dobândirea cunoștințelor În cazul exemplului anterior am definit: Ø o constrângere referențială la nivel de tabelă, care pune în legătură tabela clienti și tabela agenti_inchirieri prin intermediul câmpului de legătură id_ang, care este cheie primară în tabela agenti_inchirieri și cheie străină în tabela clienti Ø o constrângere referențială la nivel de coloană, care leagă tabela clienti de tabela adrese prin intermediul câmpului de legătură id_adresa.
Dobândirea cunoștințelor • La rularea exemplului anterior vom observa că se va genera o eroare, deoarece tabela adrese și tabela agenti_inchirieri au fost create fără a se specifica cheia primară (la momentul creării acelor tabele nu am avut cunoștințe despre noțiunea de cheie primară). • În momentul de față nu putem să creăm tabela clienti împreună cu constrângerea de cheie străină, acest lucru fiind posibil după ce vom învăța cum se adaugă o constrângere, moment în care vom putea să adăugăm constrângerile de cheie primară în tabela adrese și tabela agenti_inchierieri.
Dobândirea cunoștințelor • La definirea unei chei străine Exemplu: se poate utiliza o clauză suplimentară ON DELETE CREATE TABLE clienti CASCADE care precizează (id_client NUMBER(5) PRIMARY KEY, că la ştergerea unei linii din tabela părinte se vor şterge nume VARCHAR 2(20), id_adresa NUMBER(5) automat din tabela copil REFERENCES acele linii care fac referire la adrese(id_adresa) linia ce se şterge din tabela ON DELETE CASCADE, părinte. • Prin folosirea acestei opţiuni id_ang NUMBER(5), CONSTRAINT clienti_fk FOREIGN în exemplul alăturat, la ştergerea unei adrese se vor KEY (id_ang) REFERENCES angajati(id_ang)) şterge toţi clienţii de la adresa respectivă.
Dobândirea cunoștințelor • O altă opţiune este ON DELETE SET NULL care face ca la ştergerea unei tabele părinte, valorile cheii străine din liniile tabelei copil care fac referire la linia ştearsă vor fi setate pe NULL. • În exemplul alăturat la ştergerea unei adrese, în dreptul adresei clienţilor care au avut acea adresă va apărea valoarea NULL. Exemplu: CREATE TABLE clienti (id_client NUMBER(5), nume VARCHAR 2(20), id_adresa NUMBER(5) REFERENCES adrese(id_adresa) ON DELETE SET NULL, id_ang NUMBER(5), CONSTRAINT clienti_fk FOREIGN KEY (id_ang) REFERENCES angajati(id_ang))
Dobândirea cunoștințelor Constrângerea de verificare (CHECK) • Constrângerea CHECK defineşte explicit o condiţie pe care fiecare linie trebuie să o satisfacă. • Sintaxa: [CONSTRAINT nume constrangere] CHECK (conditie) Exemplu: CREATE TABLE imbunatatiri ( id_imbunatatiri NUMBER(3) PRIMARY KEY, mobilat VARCHAR 2(2), termopane VARCHAR 2(2), aer_conditionat VARCHAR 2(2), parchet VARCHAR 2(2), gresie VARCHAR 2(2), faianta VARCHAR 2(2), telefon VARCHAR 2(2), cablu VARCHAR 2(2), internet VARCHAR 2(2), gaz VARCHAR 2(2) CHECK (gaz='Da'), apometre VARCHAR 2(2)) În exemplul de mai sus câmpul gaz va avea valoarea “Da”.
Dobândirea cunoștințelor Observați greșelile efectuate la definirea constrângerilor în exemplul de mai jos și comentați-le:
- Slides: 16