Sunteți pe pagina 1din 14

Crearea unei baze de date Limbajul de definire a datelor(DDL) Instruciunile INSERT, DELETE, UPDATE DESCRISE n prima parte a capitolului,

se ocupau de manipularea datelor din baza de date. Acestea formeaz limbajul de manipulare a datelor (DML) ; instruciunile DML pot modifica datele din baza de date dar nu pot modifica structura acesteia. Niciuna dintre aceste instruciuni nu poate s creeze sau s tearg tabele sau coloane dintr-o tabel. Modificarea structurii bazei de date este realizat de un alt grup de instruciuni, numit de obicei Limbaj de Definire a Datelor. Utiliznd DDL putem : S crem o nou tabel. S tergem o tabel. S modificm structura unei tabele. S definim o tabel virtual (vedere). S asigurm controlul accesului la baze de date. S creem indecsi, pentru a face accesul la date mai rapid. S controlm parametrii fizici de stocare a datelor. Partea principal a DDL este format din trei aciuniSQL : CREATE, care definete i creeaz un obiect al bazei de date. DROP, care terge un obiect din baza de date. ALTER, care modific definiia unui obiect deja existent al bazei de date. Crearea unei baze de date Standardul SQL1 precizeaz limbajul utilizat pentru descrierea structurii bazei de date darn u precizeaz cum anume este creat baza de date; fiecare SGBD are o abordare proprie a modului n care creeaz o baz de date. Multe dintre SGBD-urile existe pe piat au o pereche de instuciuni CREATE DATABASE / DROP DATABASE utilizate pentru crearea i respectiv tergerea unei baze de date. Definirea tabelelor Cea mai important stuctur ntr-o baz de date relaional este tabela. Crearea unei tabele (CREATE TABLE) Instruciunea CREATE TABLE definete o nou tabel n baza de date. Diferitele clauze ale instruciunii precizeaz elementele din definiia unei tabele. Numele tabelei trebuie s fie un identificator SQL valid i unic. Tabela nou creat este goal dar este pregtit pentru adugarea de noi linii, utiliznd instruciunea INSERT.

Definirea coloanelor Coloanele tabelei nou create sunt definite n interiorul instruciunii CREATE TABLE. Definiiile coloanelor sunt incluse ntr-o list cuprins ntre paranteze rotunde, separate prin virgul. Ordinea coloanelor n lista de definiie va determina ordinea coloanelor din tabela respectiv. n instruciunea CREATE TABLE, pentru fiecare coloan putem specifica: Numele coloanei, care va fi utilizat pentru a ne referi la coloana respectiv din instruciunile SQL. Fiecare coloan din tabel trebuie s aib un nume unic n tabela respectiv dar pot exista coloane din tabele diferite care s aib acelai nume. Tipul de dat al coloanei, care va preciza natura datelor care pot fi stocate n coloana respectiv. Unele tipuri de dat, ca VARCHAR i DECIMAL necesit informaii suplimentare, cum ar fi lungimea sau numrul de zecimale. Aceste informaii suplimentare sunt cuprinse ntre paranteze rotunde care urmeaz cuvntului cheie reprezentnd tipul de dat. Dac o coloan conine, obligatoriu, valori. Clauza NOT NULL previne apariia valorilor nule ntr-o coloan. n absena acesteia, valorile NULL sunt premise. O valoare implicit pentru coloan. SGBD utilizeaz aceast valoare cnd o instruciune INSERT nu precizeaz o valoare pentru aceast coloan. Standardul SQL2 permite cteva clauze suplimentare, ca parte a definiiei unei coloane, care precizeaz dac o coloan conine valori unice, dac este cheie primar sau strin sau poate restriciona valorile pe care le poate lua aceasta. S se defineasc tabela OFFICES i coloanele acesteia.

S se defineasc tabela ORDERS i coloanele acesteia.

Instruciunea CREATE TABLE pentru o tabel dat poate varia de la un SGBD la altul deoarece fiecare SGBD suport propriul su set de tipuri de date. Standardul SQL2 permite specificarea unui domeniu, n locul unui tip de dat, n interiorul definiiei unei coloane. Domeniul este o colecie de valori valide ale datelor, definit n interiorul bazei de date i creia i se asociaz un nume. Definiia unui domeniu se bazeaz pe tipurile de date suportate de SGBD dar permite specificarea anumitor restricii ale valorilor permise pentru datele din domeniul respectiv. n exemplul urmtor este prezentat definiia unui domeniu i apoi o alt definiie a tabelei ORDERS astfel nct s utilizeze domeniul definit n prealabil.

SGBD-ul va verifica automat fiecare linie adugat pentru a se asigura c numrul de birou corespunztor acesteia este cuprins n intervalul impus. Domeniile sunt utile n cazul n care aceleai restricii se aplic mai multor coloane din tabele diferite. n baza de date folosit ca exemplu, numrul biroului apare n tabelele OFFICES i SALESREPS iar domeniul VALID_OFFICE_ID poate fi utilizat pentru definirea coloanelor din amele tabele. Valori lips i valori implicite Definiia fiecrei coloane dintr-o tabel i spune SGBD-ului dac este permis sau nu lipsa valorilor din coloana respectiv, adic dac se permite sau nu pentru coloana

respectiv s conin valoarea NULL. n majoritatea SGBD-urilor, precum i n standardul SQL, n mod implicit este permis coloanelor s conin valori NULL. Dac o anumit coloan trebuie s conin, obligatoriu, o valoare valid atunci n definiia acesteia trebuie inclus clauza NOT NULL. Standardul SQL i multe dintre produsele SQL permit stabilirea unor valori implicite ale coloanelor. Dac o coloan are o valoare implicit aceasta trebuie precizat la definirea coloanei respective. n continuare este prezentat un exemplu de instruciune CREATE TABLE care conine valori implicite pentru anumite coloane. Definirea tabelei OFFICES, utiliznd valori implicite (sintaxa ANSI/ISO).

n cazul utilizrii acestei definiii a tabelei, la inserarea unei noi linii trebuie precizate obligatoriu numai numrul biroului i oraul. Regiunea implicit este Eastern, managerul biroului este Sam Clark (agentul cu numrul 106), vnzrile sunt zero, iar planul de vnzri este NULL. Definirea cheilor primare i a cheilor strine n afar de definirea coloanelor unei tabele, n instruciunea CREATE TABLE se poate preciza cheia primar i cheile strine ale tabelei respective. Aceste funcionaliti se realizeaz cu ajutorul clauzelor PRIMARY KEY i respective FOREIGN KEY. Aceste funcionaliti sunt incluse n specificaiile ANSI/ISO i majoritatea produselor SQL ofer suport pentru ele. Clauza PRIMARY KEY precizeaz coloana sau coloanele care formeaz cheia primar a tabelei. Reamintim c o cheie primar identific n mod unic liniile dintr-o tabel. n mod implicit, coloanele care fac parte din definiia cheii primare au asociate restricii de tip valoare unic i NOT NULL. Clauza FOREIGN KEY precizeaz cheile strine dintr-o tabel i relaiile pe care acestea le creeaz cu alte tabele (tabelele printe). n cadrul acestei clauze se specific: Coloana sau coloanele care formeaz cheia strin; toate coloanele care formeaz cheia strin trebuie s fac parte din tabela care urmeaz a fi creat. Tabela care este referit de cheia strin. Acesta este tabela printe din relaie; tabela n curs de definire este tabela copil. Un nume pentru relaia dintre tabela copil i cea printe (numele relaiei este opional). Acest nume nu este utilizat n nici o instruciune SQL de manipulare a bazelor

de date dar poate apare n mesajele de eroare emise de sistem i este necesar dac dorim s tergem cheia strin. Modul n care SGBD-ul trebuie s trateze valorile NULL din una sau mai multe coloane ale cheii strine. O regul opional de tergere (DELETE) n cadrul relaiei (CASCADE, SET NULL, SET DEFAULT sau NO ACTION), care va determina ce aciuni vor fi efectuate la tergerea unei linii din tabela printe. O regul opional de modificare (UPDATE), care determin aciunile efectuate la modificarea valorilor cheii primare din tabela printe. O condiie opional de validare, care s restricioneze datele din tabela respectiv astfel nct aceasta s conin numai linii care satisfac condiia respectiv. n continuare este prezentat un exemplu de instruciune CREATE TABLE pentru tabela ORDERS, n care sunt include definiii ale cheii primare precum i ale cheilor strine

Figura 5.X ne arat relaiile definite de aceast instruciune i numele asociate acestora. n general este recomandat s atribuim nume relaiilor deoarece ele ne ajut s nelegem mai bine relaiile create ntre tabele prin intermediul cheilor strine. De exemplu, fiecare comand este efectuat de un client al crui numr apare n coloana CUST a tabelei ORDERS. Relaia creat de aceast coloan a fost denumit PLACEDBY.

Figura 5.24 Stabilirea relaiilor ntre tabele, n cadrul instruciunii CREATE TABLE Cnd SGBD-ul proceseaz instruciunea CREATE TABLE, verific fiecare definiie a unei chei strine. SGBD-ul se asigur c att cheia strin ct i cheia primar la care aceasta face referire au acelai numr de coloane iar coloanele respective au acelai tip de dat. Tabela printe trebuie s fie deja creat pentru ca aceast verificare s reueasc. Observm c n cadrul clauzei FOREIGN KEY sunt specificate regulile de tergere i modificare. Dac nu este specificat nici o aciune referenial, SGBD-ul va considera implicit opiunea NO ACTION. Dac dorim s crem dou sau mai multe tabele din cadrul unui ciclu referenial (cum sunt tabelele OFFICES i SALESREPS din baza de date utilizat ca exemplu) nu putem include o definiie a cheii strine n prima instruciune CREATE TABLE deoarece tabela referit nu exist nc. Va trebui s crem mai nti prima tabel fr definiia cheii strine i s- adugm ulterior acestei cheia strin, utiliznd instruciunea ALTER TABLE. Restricii de tip valoare unic Standardul SQL2 permite specificarea restriciilor de tip valoare unic n instruciunea CREATE TABLE, utiliznd clauza UNIQUE. Mai jos este prezentat o variant a 6

instruciunii CREATE TABLE pentru tabela OFFICES care conine o clauz UNIQUE pentru coloana CITY.

Restricii de validare (check) Un alt tip de restricie, check, poate fi specificat n instruciunea CREATE TABLE. O restricie de validare conine o condiie (similar condiiei de selecie din instruciunea SELECT) care este verificat la fiecare actualizare a tabelei (la oricare operaie INSERT, UPDATE sau DELETE). Dc rezultatul evalurii condiiei este TRUE atunci actualizarea este permis; n caz contrar actualizarea este respins i este semnalat o eroare. Urmtorul exemplu este o instruciune CREATE TABLE pentru tabela OFFICES, cu o condiie de validare extrem de simpl, care garantaez c planul de vnzri al unui birou este mai mare de $0.00.

Opional, putem atribui un nume restriciei ; acesta va fi utilizat de SGBD atunci cnd semnaleaz nclcarea restriciei respective. Mai jos este prezentat un exemplu de restricie de validare asociat tabelei SALESREPS care asigur respectarea regulii : "agenilor de vnzri angajai dup 1 Ianuarie 1988 nu le pot fi stabilite cote de vnzri mai mari de $300.000,00". Aceast restricie poart numele de QUOTA_CAP. 7

tergerea unei tabele (DROP TABLE) Putem terge o tabel din baza de date utiliznd instruciunea DROP TABLE n care se specific numele tabelei ce urmeaz a fi tears. n urmtorul exemplu, tabela CUSTOMERS este nlocuit cu dou noi tabele, CUST_INFO i ACCOUNT_INFO.

Cnd instruciunea DROP TABLE terge o tabel din baza de date, definiia i coninutul acesteia se pierd. Nu exist nici o posibilitate de recuperare. Datorit consecinelor sale, instruciunea DROP TABLE trebuie utilizat cu precauie. Standardul SQL2 precizeaz c instruciunea DROP TABLE trebuie s conin fie o clauz CASCADE fie o clauz RESTRICT care s precizeze efectul pe care l va avea tergerea tabelei respective asupra altor obiecte ale bazei de date (cum sunt vederile) care depind de aceasta. Majoritatea produselor comerciale SQL accept instruciunea DROP TABLE fr nici o clauz. Modificarea definiiei unei tabele (ALTER TABLE) Modificarea definiiei unei tabele se realizeaz cu ajutorul instruciunii ALTER TABLE. Aceasta permite: Adugarea unei coloane ntr-o tabel. tergerea unei coloane dintr-o tabel. Modificarea valorii implicite a unei coloane. Adugarea sau tergerea cheii primare a unei tabele. Adugarea sau tergerea unei chei strine dintr-o tabel. Adugarea sau tergerea unei restricii de tip valoare unic a unei tabele. Adugarea sau tergerea unei restricii de validare a unei tabele.

Standardul SQL2 restricioneaz fiecare instruciune ALTER TABLE la o singur modificare a unei tabele. De exemplu, pentru a aduga o nou coloan i pentru a defini o nou cheie strin sunt necesare dou instruciuni ALTER TABLE. Cteva SGBD-uri permit realizarea mai multor modificri ntr-o singur instruciune ALTER TABLE. Adugarea unei coloane Cea mai frecvent utilizare a instruciunii ALTER TABLE este pentru adugarea unei coloane noi la o tabel deja existent. Definirea unei coloane n instruciunea ALTER TABLE este similar celei din instruciunea CREATE TABLE i funcioneaz n acelai mod. Nou coloan este adugat la sfritul definiiei tabelei i este situat cel mai la dreapta. Implicit, SGBD-urile asociaz valoarea NULL pentru coloana nou adugat n toate liniile deja existente. Dac aceast coloan are asociat o clauz NOT NULL va trebui s aib specificat i o valoare implicit. SGBD-ul va aduga, pentru coloana respectiv, valoarea implicit n toate liniile existente. S se aduge un nume de contact i un numr de telefon pentru fiecare client.

Pentru fiecare produs, s se adauge cantitatea minim permis.

n primul exemplu, noua coloan va avea valoarea NULL pentru clienii deja existeni. n al doilea exemplu, coloana MIN_QTY va avea valoarea zero ( 0 ) pentru produsele deja existente. Iniial, instruciunea ALTER TABLE nu permitea adugarea dect a definiiei unei coloane ntr-o tabel i semnificaia clauzei ADDera evident. Ulterior, s-a permis adugarea de noi chei primare, chei strine i alte tipuri de restricii iar clauza ADD pentru aceste tipuri de obiecte trebuie s precizeze tipul obiectului la care se refer. Pentru compatibilitate cu aceste noi clauze ADD/DROP, standardul SQL2 include, opional, cuvntul cheie COLUMN dup cuvntul cheie ADD, n cazul adugrii unei noi coloane. Cu aceast completare, exemplul precedent devine:

tergerea unei coloane

Instruciunea ALTER TABLE poate fi utilizat pentru a terge una sau mai multe coloane dintr-o tabel. S se tearg coloana HIRE_DATE din tabela SALESREPS.

Standardul SQL impune utilizarea unor instruciuni separate ALTER TABLE pentru tergerea mai multor coloane dar unele SGBD-uri permit tergerea mai multor coloane dintr-o tabel ntr-o singur instruciune ALTER TABLE. Menionm c tergerea unei coloane poate ridica aceleai probleme privind integritatea ca i n cazul operaiilor de actualizare. De exemplu, dac tergem o coloan care este cheie primar referit de o cheie strin, atunci coloana reprezentnd cheia strin va deveni invalid. Probleme similare apar dac ncercm s tergem o coloan care este referit ntr-o clauz check sau este folosit n definiia unei vederi. Standardul SQL2 trateaz aceste caracteristici n acelai mod n care trateaz problemele de integritate ridicate de instruciunile DELETE i UPDATE. Putem specifica una din urmtoarele reguli de tergere: RESTRICT; dac vreunul dintre obiectele bazei de date (chei strine, restricii etc.) depind de coloana care urmeaz s fie tears atunci instruciunea ALTER TABLE eueaz i coloana nu poate fi tears. CASCADE; toate obiectele din baza de date (chei strine, restricii etc.) care depind de coloana respectiv vor fi, de asemenea, terse. Efectul tergerii n cascad poate produce modificri dramatice n baza de date i, de aceea, trebuie utilizat cu precauie. Se recomand tergerea explicit a cheilor strine i a celorlalte restriciilor dependente, prin utilizarea instruciunii DROP corespunztoare, nainte de tergerea unei coloane. Modificarea cheilor primare i a cheilor strine O alt utilizare frecvent a instruciunii ALTER TABLE este pentru a modifica sau a aduga o cheie primar sau o cheie strin la definiia unei tabele. Spre deosebire de coloanele unei tabele, cheile primare i cheile strine pot fi att adugate ct i terse cu ajutorul instruciunii ALTER TABLE. Clauzele care permit adugarea unei chei primare sau strine sunt aceleai ca n cazul instruciunii CREATE TABLE i lucreaz n acelai mod. Menionm c putem terge o cheie strin numai dac relaiei introduse de aceasta i se asociaz un nume. S se modifice tabela OFFICES astfel nct coloana REGION s devin cheie strin care refer cheia primar din tabela nou creat REGION.

10

n continuare este prezentat un exemplu de instruciune ALTER TABLE care modific o cheie primar. Menionm c, n acest caz, trebuie terse eventualele cheile strine care fceau referire la cheia primar n cauz. S se modifice cheia primar a tabelei OFFICES.

Indeci (CREATE/DROP INDEX) Una dintre structurile fizice de stocare furnizate de majoritatea SGBD-urilor bazate pe SQL o constituie indexul. Un index este o structur care permite accesul rapid la liniile unei tabele, pe baza valorilor unei sau mai multor coloane. Figura 5.x ne arat tabela PRODUCTS i doi indeci care au fost creai pentru aceasta. Unul dintre indeci permite accesul rapid pe baza valorilor coloanei DESCRIPTION; cellalt permite accesul pe baza valorilor cheii primare, care este constituit din coloanele MFR_ID i PRODUCT_ID.

11

Figura 5.25 Doi indeci asociai tabelei PRODUCTS Indecii stocheaz valorile datelor i pointeri ctre liniile n care apar aceste valori. ntrun index valorile datelor sunt aezate n ordine cresctoare sau descresctoare i, n consecin, SGBD-ul poate gsi repede o anumit valoare. Apoi utilizeaz pointerul asociat acesteia pentru a localiza linia care conine valoarea respectiv. Prezena sau absena unui index nu este vizibil utilizatorului care acceseaz o tabel. De exemplu, s considerm urmtoarea interogare SQL: S se afieze stocul i preul produsului Size 4 Widgets.

Instruciunea nu precizeaz dac exist sau nu un index corespunztor coloanei DESCRIPTION. SGBD-ul va procesa interogarea n ambele situaii. Dac nu exist un index corespunztor coloanei DESCRIPTION, SGBD-ul va fi nevoit s proceseze interogarea prin parcurgerea secvenial a tabelei PRODUCTS, linie cu linie, examinnd valoarea coloanei DESCRIPTION din fiecare linie. Pentru a determina toate liniile care satisfac condiia de selecie, va trebui s examineze toate liniile din tabel. Pentru o tabel cu mii sau milioane de nregistrri scanarea tabelei poate dura cteva minute sau chiar ore.

12

Prin utilizarea unui index pentru coloana DESCRIPTION, SGBD-ul poate localiza datele cerute cu mult mai puin efort. Va cuta n index, pentru a determina valoarea cerut (Size 4 Widget) i apoi va utiliza pointerul asociat acesteia pentru a gsi linia corespunztoare din tabel. Cutarea ntr-un index este foarte rapid deoarece indexul este ordonat iar liniile acestuia sunt foarte mici. Trecerea de la index la liniile corespunztoare din tabela este, de asemenea, foarte rapid deoarece indexul i spune SGBD-ului unde sunt localizate pe disc liniile respective. Aa cum se arat i n acest exemplu, avantajul utilizrii indecilor const n creterea vitezei de execuie a instruciunilor SQL care au condiii de selecie care se refer la coloanele dup care se face indexarea. Unul dintre dezavantajele indecilor este necesitatea unui spaiu de stocare suplimentar pe disc. Un alt dezavantaj l constituie faptul c un index trebuie actualizat de fiecare dat cnd este adugat o nou linie n tabela sau este actualizat valoarea coloanei indexate dintr-o linie deja existent. Aceasta impune instruciuni INSERT i UPDATE suplimentare pentru tabela respectiv. Se recomand crearea de indeci corespunztoare coloanelor care sunt utilizate frecvent n condiii de selecie. De asemenea, se recomand utilizarea indecilor n cazul tabelelor care sunt frecvent interogate i nu n cazul tabelelor care sunt frecvent actualizate. Majoritatea SGBD-urilor creeaz automat un index pentru coloanele care alctuiesc cheia primar a unei tabele. Pentru baza de date utilizat ca exemplu, n afara indecilor corespunztori cheilor primare ale tabelelor, putem defini urmtorii indeci pentru urmtoarele coloane: Coloana COMPANY din tabela CUSTOMER, dac datele despre clieni sunt accesate frecvent pe baza denumirilor companiilor. Coloana NAME din tabela SALESREPS, dac datele referitoare la agenii de vnzri sunt accesate adesea pe baza numelor acestora. Coloana REP din tabela ORDERS, n cazul n care comenzile sunt accesate frecvent pe baza agenilor de vnzri care le-au primit. Coloana CUST din tabela ORDERS, n cazul n care comenzile sunt accesate frecvent pe baza clienilor care le-au efectuat. Coloanele MFR i PRODUCT, mpreun, dac accesarea comenzilor se face adesea pe baza produselor comandate. Standardul SQL2 nu face precizri asupra indecilor sau a modului n care sunt acetia creai. Majoritatea sistemelor SQL permit ns crearea indecilor, prin utilizarea instruciunii CREATE INDEX. Instruciunea permite asocierea unui nume indexului respectiv i precizarea tabelei pentru care este creat acesta. De asemenea, instruciunea precizeaz coloanele dup care se face indexarea precum i ordinea n care vor fi sortate liniile (ascendent sau descendent). Instruciunea CREATE INDEX poate conine opiunea UNIQUE, care precizeaz dac pentru combinaia de coloane dup care se face indexarea sunt permise sau nu valorile duplicat. Urmtorul exemplu creeaz un index pentru tabela ORDERS, pe baza coloanelor MFR i PRODUCT iar aceast combinaie de coloane trebuie s conin valori unice pentru fiecare dintre liniile tabelei. S se creeze un index pentru tabela ORDERS.

13

Instruciunea DROP INDEX terge un index din baza de date. S se tearg indexul creat n exemplul anterior.

14