Sunteți pe pagina 1din 18

BAZE DE DATE

LABORATOR 1

BD
1. Noţiuni introductive

În prezent, bazele de date reprezintă nucleul sistemelor informatice din orice companie sau instituţie, având un
impact major asupra modului de funcţionare şi organizare al acestora. Totodată oferă o deschidere majoră asupra
pieţii pe care o vizează, oferind posibilitatea clienţilor de a avea acces în mod facil la datele esenţiale de care aceştia
au nevoie.

Trebuie avut în vedere faptul că de multe ori, în viaţa de zi cu zi, prin abuz de limbaj, se foloseşte termenul de Bază
de Date (BD) pentru a desemna de fapt un Sistem de Gestiune a Bazelor de Date (SGBD). Ce este deci o bază de
date şi care este diferenţa faţă de un sistem de gestiune a bazelor de date?

Putem defini într-o primă etapă o Bază de Date (BD) ca fiind un ansamblu de date structurat, stocat în mod

or
centralizat sau nu, pe servere, accesibil, interogabil şi modificabil de un grup de utilizatori care lucrează în paralel,
prin intermediul uneia sau a mai multor aplicaţii. Pe de altă parte, un Sistem de Gestiune a Bazelor de Date (SGBD)
poate fi văzut generic ca un sistem care se ocupă de structurarea, stocarea, actualizarea şi mentenanţa datelor,
reprezentând de fapt interfaţa între baza de date şi utilizator sau aplicaţiile acestuia.

În cadrul acestui laborator vom lucra cu baze de date relaţionale, iar ca sistem de gestiune a bazei de date se va
rat
utiliza programul MySQL.

Bazele de date relaţionale au la bază modelul relaţional care lucrează cu două concepte importante: relaţie şi tabel,
Cele două diferă prin natura lor, dar sunt foarte corelate. Noţiunea de relaţie este formală, deoarece conceptul
provine din matematică, în particular din teoria mulţimilor, în timp ce noţiunea de tabel este simplă şi intuitivă. Pe de
o parte tabelele oferă o înţelegere naturală a structurii bazei de date chiar şi pentru utilizatorii ce nu sunt specializaţi
în domeniu. Pe de altă parte, existenţa unei formalizări matematice clare şi simple a permis dezvoltarea unei teorii
care să sprijine modelul, cu rezultate foarte interesante în industrie.

Atunci când o relaţie este concepută sub forma unui tablou de valori, fiecare linie din tabel reprezintă un ansamblu de
bo

valori corelate. În cazul modelului relaţional, fiecare linie din tabel corespunde de fapt unei entităţi sau unei relaţii
din lumea reală. Dacă se consideră un tabel denumit tblStudent (Figura I.1) caracterizat de coloanele reprezentative:
nume, numarMatricol, telefonMobil, telefonFix, adresa, anNastere și mediaNotelor atunci toate valorile dintr-o
coloană a tabelului sunt de acelaşi tip. În cazul terminologiei modelului relaţional, o linie din tabel poartă denumirea
de tuplu, înregistrările stocate în coloanele tabelului sunt denumite atribute, în timp ce tabelele poartă numele de
relaţii. Tipurile de date introduse în fiecare coloană sunt reprezentate de către un domeniu de valori posibile.
La

Fig. I.1. Relaţia tblStudent

1
Orice relaţie poate fi definită ca un ansamblu de tupluri. Elementele acestui ansamblu nu sunt ordonate, adică într-o
relaţie, tuplurile nu se supun nici unei reguli particulare putând fi ordonate în mod arbitrar. De asemenea, atributele
unei relaţii pot fi ordonate pe baza unui set de reguli însă nu există o ordine preferenţială. În cazul exemplului

BD
prezentat în Figura I.1, relaţia tblStudent este definită prin: nume, numarMatricol, telefonMobil, telefonFix, adresa,
anNastere, mediaNotelor şi este considerată identică cu relaţia tblStudent definită astfel: nume, numarMatricol,
anNastere, adresa, telefonFix, telefonMobil, mediaNotelor.

În cazul general, o bază de date este formată dintr-un ansamblu de relaţii (tabele – Figura I.2) între care se stabilesc
o serie de corespondenţe.

or Fig. I.2. Exemplu de bază de date

Din Figura I.2 se poate observa că diferitele coloane aferente tabelelor din baza de date au o semnificaţie diferită în
rat
ceea ce priveşte modul de reprezentare al entităţilor. Astfel, în funcţie de rolul pe care îl joacă se pot distinge trei
tipuri de coloane:

1. Cheie primară - reprezintă o coloană care permite identificarea în mod unic a unei înregistrări (a unei linii din
tabel). Pentru baza de date din Figura I.2, coloana 𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖 poate reprezenta identificatorul înregistrărilor din
tabelul 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡, iar 𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐 pentru înregistrările din tabelul 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡. Atunci când o coloană este
specificată ca identificator sau cheie pentru un tabel se impune implicit ca valoarea atributului să fie diferită pentru
toate tuplurile relaţiei.
bo

În practică, de cele mai multe ori este posibilă găsirea unor chei primare printre atributele care se definesc în mod
natural pentru o clasă de entităţi ce trebuie modelată, însă sunt şi situaţii în care acest lucru nu este posibil. Pentru
astfel de cazuri se poate introduce un atribut suplimentar care se generează şi se asociază fiecărui tuplu în momentul
inserării informaţiei. De altfel este o practică bună de a folosi această soluţie ori de câte ori există un dubiu că
valorile unei chei primare se pot modifica în timp sau nu pot identifica în orice situaţie, în mod unic un tuplu. Se
poate remarca faptul că şi în lumea reală se recurge la această soluţie pentru identificarea fără echivoc a persoanelor
(CNP) / a studenţilor (număr de înmatriculare) / a documentelor (număr de înregistrare), etc.
La

2. Al doilea tip de coloană care poate forma o tabelă îl reprezintă cheia străină. Cheile străine sunt de fapt o copie a
identificatorului primar dintr-un alt tabel. Fiecare valoare a sa joacă rolul unei referinţe la o linie dintr-un alt tabel cu
care se află în asociere. Din acest motiv, acest tip de coloană se mai numeşte şi coloană de referinţe.

Pentru exemplul din Figura I.2, tabelul tblOferte conţine două chei străine: 𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐 care reprezintă o referinţă
către o entitate de tip Furnizori (respectiv către o linie din tabelul tblFurnizori) şi codProdus care reprezintă o
2
referinţă către o entitate de tip Produs (respectiv către o linie din tabelul tblProduse). Se poate observa deci, că prin
intermediul cheilor străine se pot pune în corespondenţă tupluri din tabele distincte. Pentru fiecare ofertă specificată
pe câte o linie în cadrul relaţiei tblOferte, putem cunoaşte atât informaţiile privind furnizorul (ex: nume, telefon) cât

BD
şi detalii despre produsul ofertat (ex: descriere).

Trebuie notat faptul că numele unei coloane care formează o cheie străină este independent de cel al identificatorului
la care se face referire. Pot exista situaţii în care dezvoltatorul bazei de date alege numele cheii străine să fie similar
cu cel al cheii primare la care se face referire (ex: numele cheii primare codProdus din tblProduse este identic cu
numele cheii străine din tblOferte), sau foarte bine ele pot fi diferite (ex: numele cheii primare idFurnizor din
tblFurnizor este diferit de numele cheii străine codFurnizor din tblOferte ).

Analizând în detaliu exemplul din Figura I.2 se poate remarca faptul că relaţia tblOferte nu deţine un atribut propriu
care să joace rolul de identificator primar aşa cum se întâmplă în cazul tabelului tblFurnizori care are cheia primară
idFurnizor sau tblProduse care deţine cheia primară codProdus. Pentru tblOferte, cheia primară va fi compusă din
setul de atribute codFurnizor şi codProduse care sunt totodată şi chei străine. Însă, în acest caz se presupune că un
furnizor nu va putea să facă decât o singură ofertă pentru un anumit produs.

or
3. Cel de-al treilea tip de coloane care apar în cadrul tabelelor dintr-o bază de date, îl reprezintă coloanele cu
informaţii suplimentare, care nu au decât rolul de a descrie entitatea pe care o reprezintă. Pentru exemplul din
Figura I.2, este cazul atributelor nume şi telefon din tabelul tblFurnizori, descriere din tblProduse sau pret din
relaţia tblOferte.

De manieră generală, obiectele, împreună cu proprietăţile ce le caracterizează se supun unor reguli stricte în lumea
rat
reală. În mod similar, atunci când se doreşte modelarea lor sub formă de informaţii digitale şi stocarea în baze de date
este necesară păstrarea regulilor după care ele sunt guvernate. Spunem că datele trebuie să respecte o serie de
constrângeri de integritate. Orice operaţie de modificare, adăugare sau ştergere a unei valori din baza de date nu
trebuie să conducă în vreun fel la încălcarea acestor constrângeri. Figura I.3 prezintă o instanţă a unei baze de date în
care mai multe constrângeri de integritate sunt violate, astfel:

a) în relaţia tblNote, cel de-al doilea tuplu conţine o valoare care nu poate fi admisă pentru atributul medie,
dacă se impune ca nota maximă la o materie să fie 10.
bo

b) în relaţia tblStudenti, studentul cu numărul matricol 2459 nu poate avea bursă de merit având în vedere că are
un examen picat (la Retele de comunicaţii).
c) ultimele două tupluri din relaţia tblStudent conţin informaţii despre doi studenţi diferiţi, dar care au acelaşi
număr matricol. Acest lucru este imposibil dacă luăm în calcul faptul că atributul numarMatricol este considerat
cheie primară pentru relaţia tblStudenti şi ar trebui să identifice în mod unic fiecare entitate.
d) tabelul tblNote conţine un tuplu pentru care atributul Student are o valoare (3256) care nu se regăseşte printre
numerele matricole înregistrate în relaţia tblStudenţi (coloana corespunzătoare atributului numarMatricol).
Similar, studentul Popescu Mihai are înregistrată o notă pentru un curs care nu se regăseşte în lista de cursuri din
La

tblCursuri.
e) relaţia tblCursuri conţine un tuplu pentru care valoarea atributului idCurs (care este cheie primară) are
valoarea Null.

3
BD
Fig. I.3. Exemplu de bază de date care încalcă o serie de constrângeri de integritate

Tocmai pentru a evita astfel de situaţii în cadrul bazelor de date a fost definit conceptul de constrângere de integritate
care trebuie respectat indiferent de situaţie. Constrângerile de integritate pot fi definite fie în momentul creării

or
tabelelor, fie ulterior pentru a putea impune condiţii suplimentare.

Din punctul de vedere al elementelor afectate de constrângeri, se pot defini două categori:

- Constrângeri intra-relaţie – fac referire doar la o singură tabelă din baza de date. Această clasă poate fi divizată
în trei subclase, astfel:
rat
• Constrângeri de tuplu – pot fi evaluate pentru fiecare tuplu în mod independent de restul celorlalte
linii din tabelă. Pentru exemplul considerat anterior, în această categorie intră cazurile prezentate la
punctele a) şi e)
• Constrângeri de domeniu – sunt evaluate valorile atributelor pentru a asigura integritatea domeniilor
(ex: dacă valorile sunt de un anumit tip de date, dacă sunt într-un anumit domeniu de valori, dacă
sunt obligatorii sau nu, etc ). Pentru exemplul considerat anterior, în această categorie intră cazurile
prezentate la punctele a) , c) şi e). Un caz particular, dar important, al acestei subclase de
constrângeri îl reprezintă constrângerile referitoare la cheia primară.
bo

• Constrângeri de dependenţă între valorile atributelor – sunt evaluate valorile anumitor atribute în
funcţie de alte atribute din cadrul relaţiei (cazul c) din exemplul considerat).

- Constrângeri inter-clasă – presupune stabilirea unor reguli care implică mai multe relaţii. Pentru exemplul
considerat anterior, în această categorie intră cazurile prezentate la punctele b) şi d). Cele mai importante
constrângeri inter-clasă sunt cele legate de integritatea referenţială care impun reguli asupra cheilor străine (cazul d)
din exemplul considerat).
La

2. Limbajul SQL

SQL (Structured Query Language sau limbaj structurat de interogări) reprezintă un limbaj structurat de programare
care permite crearea de baze de date, adăugarea de informaţii şi recuperarea de date precise care sunt necesare la un
anumit moment de timp. Limbajul SQL a fost dezvoltat în special pentru lucrul cu baze de date care se axează pe
modelul relaţional, fiind în prezent cel mai utilizat limbaj folosit în cadrul sistemelor de gestiune a bazelor de date.
4
Limbajul SQL permite atât definirea structurii (schemei) bazei de date cât şi manipularea acesteia, sub formă de
interogări (comenzi) pe care sistemele de gestiune a bazelor de date trebuie să le execute în mod corespunzător.
Aceste interogări pot fi introduse direct în terminal, rezultatul afişându-se direct pe ecran sau pot fi trimise indirect

BD
către SGBD prin intermediul unor programe dezvoltate în limbaje de programare precum C++, Java, PHP, caz în
care rezultatele sunt stocate linie cu linie în variabile de program.

În prezent există o multitudine de dezvoltatori de sisteme de gestiune a bazelor de date care oferă diferite
funcţionalităţi pentru uşurarea modului de interacţiune al utilizatorului cu baza de date pe care o administrează sau o
utilizează. Putem aminti aici de câteva exemple de sisteme de gestiune a bazelor de date, precum: MySQL, Oracle,
IBM DB2, Microsoft SQL Server, etc. Având în vedere însă, că SQL este un limbaj standardizat la nivel
internaţional, toate aceste sisteme adoptă o aceeaşi normă pentru definirea relaţiilor şi manipularea datelor.

În cadrul acestui material va fi utilizat pentru exemplificare sistemul de gestiune al bazelor de date MySQL dezvoltat
de compania suedeză MySQL AB. MySQL este un sistem de tip open source (codul sursă este disponibil în mod
gratuit şi poate fi modificat în funcţie de necesităţile programatorului), foarte popular printre dezvoltatorii de aplicaţii
software şi pagini web. Are la bază limbajul de date SQL, rulează pe orice tip de sistem de operare şi poate fi

or
interconectat cu uşurinţă cu alte aplicaţii dezvoltate în limbaje de programare precum: C++, Java, Perl, PHP, etc.

MySQL poate fi instalat utilizând pachetul de aplicaţii WampServer care este disponibil la adresa web:
http://www.wampserver.com/. Acest pachet conţine pe lângă MySQL şi o serie de alte utilitare folosite pentru
dezvoltarea de aplicaţii web (Wamp = Apache, PHP, MySQL). Nota: În cazul în care pe sistem nu este instalat deja
un mediu de dezvoltare Visual Studio, înainte de rularea serverului Wamp, este necesară instalarea pachetului Visual
C++ Redistributable.
rat
În mod predefinit, serverul Wamp se instalează în C:\wamp (C:\wamp64), iar MySQL se găseşte în directorul:
C:\wamp\bin\mysql. Pachetul MySQL include două module: MySQL server şi MySQL client. Serverul MySQL se
ocupă de partea de management a bazei de date, a tabelelor, a controlului accesului utilizatorilor şi de procesarea
interogărilor SQL. Modulul de client permite utilizatorilor conectarea şi interacţiunea cu serverul MySQL. Prin
intermediul clientului MySQL, utilizatorul trimite toate interogările către server.

După instalarea şi pornirea pachetului WampServer, managerul aplicaţiei poate fi deschis din zona de notificări de pe
bara de start (system tray) conform Figurii I.4. În cazul în care toate aplicaţiile din pachet rulează în mod corect,
bo

iconiţa aplicaţiei are culoarea verde, ceea ce înseamnă că serverul MySQL este pornit. Pentru a porni un client
MySQL se rulează executabilul mysql.exe conform Figurii I.4.
La

Figura 1.4. Lansarea consolei MySQL pentru client

5
În momentul pornirii consolei MySQL, aplicaţia solicită introducerea unei parole pentru administrare. În mod
predefinit, în MySQL, numele de utilizator este root şi nu este setată nici o parolă. Deci, la solicitarea introducerii
unei parole se poate apăsa direct tasta Enter. Pornirea consolei MySQL se poate realiza şi din terminalul de

BD
Windows. Pentru aceasta, la butonul de start se tastează „cmd”, iar în fereastra deschisă se introduce comanda:

C:\wamp\bin\mysql\mysql5.7.19\bin\mysql -u root -p

Nota: Calea către executabilul mysql.exe trebuie modificată în mod corespunzător în funcţie de locaţia unde a fost
instalat pachetul WampServer.

Iniţial utilizatorul nu este conectat la nici o bază de date, deci nu poate manipula în nici un fel tabelele existente, dar
poate lansa o serie de comenzi privind starea sistemului. Pentru exemplificare, vom enumera în continuare câteva
interogări şi comenzi care nu au legătură directă cu o bază de date:

• Comandă pentru a cunoaşte versiunea clientului MySQL şi pentru a afla data curentă (setată pe sistemul de

or
operare) :

mysql> SELECT VERSION( ), CURRENT_DATE;

Se poate observa faptul că orice comandă sau interogare se termină cu simbolul “;”. Dacă acest simbol este omis şi se
apasă tasta Enter, atunci interpretorul MySQL nu va executa comanda respectivă ci va trece pe rând nou,
considerând că utilizatorul doreşte să continue scrierea comenzii pe mai multe linii:
rat
mysql> SELECT VERSION( ),
-> CURRENT_DATE
-> ;

Rezultatul interogării:
bo

În ambele cazuri prezentate anterior, rezultatul interogării este returnat sub forma unui tabel, unde prima linie conţine
numele informaţiilor cerute, iar cea de-a doua linie conţine efectiv datele corespondente. Sub tabel este afişat
numărul de rezultate returnate (în acest caz 1) şi timpul necesar pentru execuţia comenzii.

• Comandă pentru a determina utilizatorul curent conectat:

mysql> SELECT user();


La

Se poate observa faptul că MySQL este invariant la modul de scriere al caracterelor, capitalizat sau nu.

6
• Pentru a anula o comandă care a început să fie scrisă pe mai multe rânduri, se poate adăuga la comandă “\c”:

BD
mysql> SELECT VERSION( ),
-> CURRENT_DATE
-> \c
mysql>

• Pentru a închide sesiunea de lucru MySQL se poate folosi comanda:

mysql> quit

În acest caz nu este necesară adăugarea simbolului “;” la sfârşitul comenzii.

• Pentru a putea vizualiza şi alte comenzi pe care MySQL le poate interpreta se poate folosi:

or
mysql> help rat
bo

• În terminal se pot realiza în mod direct şi operaţii matematice:

mysql> SELECT cos(PI( )/ 3), (235 + 24)*3;


La

• Pentru a putea vizualiza bazele de date existente se poate folosi comanda:

7
mysql> SHOW DATABASES;

BD
• Pentru a accesa o bază de date din cele existente se poate folosi comanda (ex: information_schema, care
conţine date generale despre mediul SQL):

mysql> USE information_schema;

• Odată selectată o bază de date, se pot vizualiza tabelele din cadrul acesteia cu ajutorul comenzii:

or
mysql> SHOW TABLES;

……………………………………………….

Limbajul SQL este format din două mari componente:


rat
- Limbajul de descriere a datelor (DDL – Data Description Language) care permite definirea schemei (structurii)
bazei de date, definirea tabelelor şi a relaţiilor dintre elementele componente, precum şi atribuirea drepturilor de
acces a utilizatorilor la baze de date;
- Limbajul de manipulare a datelor (DML – Data Manipulation Language) permite adăugarea de informaţii în
baza de date (INSERT), actualizarea (UPDATE) sau ştergerea (DELETE) lor, precum şi interogarea datelor
pentru a avea acces doar la o subcolecţie de informaţii care sunt utile utilizatorului la un anumit moment de
timp.

Limbajul de descriere a datelor - DDL


bo

Limbajul de descriere a datelor este compus în principal din trei comenzi: CREATE, ALTER şi DROP. Instrucţiunea
CREATE este folosită pentru crearea structurii (schemei) esenţiale a bazei de date, ALTER pentru modificarea
structurii existente şi DROP pentru ştergerea acesteia în întregime sau doar a unor componente (tabele).

O bază de date este definită de propria sa schemă. Din acest motiv, SQL propune crearea unei scheme înainte de
definirea componentelor sale (tabele). Acest lucru se poate realiza cu ajutorul instrucţiunilor:
La

mysql> CREATE SCHEMA companieDB;


SAU
mysql> CREATE DATABASE companieDB;

Cele două instrucţiuni sunt echivalente. Crearea unei baze de date nu implică şi selecţia ei. De aceea, pentru a o putea
manipula este necesară utilizarea comenzii USE.

8
mysql> USE companieDB;

BD
Odată creată baza de date şi selectată, se pot defini tabele cu ajutorul clauzei CREATE TABLE specificând numele
tabelului, numele şi tipul coloanelor (numele atributelor plus domeniul asociat) precum şi constrângerile acolo unde
este cazul. Această instrucţiune va crea un tabel gol, fără date.

mysql> CREATE TABLE tblAngajati (


idAngajat SMALLINT NOT NULL,
numeAngajat VARCHAR(50),
CNP CHAR(13),
departament SMALLINT DEFAULT 1,
functia CHAR(20),
salariu DECIMAL(7,2),
dataNasterii DATE
);

or
Odată definită structura unui tabel, această poate fi verificată/vizualizată cu ajutorul comenzi:

mysql> DESCRIBE tblAngajati;


rat
Din exemplul anterior se poate observa că în momentul definirii unui tabel, fiecare coloană are asociat un tip de date
care va reprezenta în mod corect informaţia care este stocată pe acea coloană. De exemplu, coloana numeAngajat
este definită cu tipul de date VARCHAR(50) ceea ce corespunde unui şir de caractere de lungime variabilă, dar de
maximum 50 de caractere. Pentru a optimiza structura tabelelor este necesară întotdeauna alegerea tipului de date
potrivit care utilizează cât mai puţină memorie, dar care să permită stocarea oricărei informaţii care ar putea fi
bo

plasată în acea categorie. De exemplu, nu are sens definirea coloanei numeAngajat ca un tip de date CHAR(1000),
deoarece cu fiecare înregistrare, memoria ocupată va creşte inutil. Pe de altă parte, dacă definim coloana
numeAngajat ca un tip de date CHAR(10), există riscul ca pentru unele persoane să nu poată fi stocată informaţia
complet.

Tipuri de date definite în MySQL

Pentru o înţelegere mai exactă a modului în care trebuie definite coloanele din tabelele unei baze de date în funcţie de
La

informaţia pe care trebuie să o modeleze, se vor prezenta în continuare tipurile de date suportate de MySQL:

• Tipurile de date numerice

În MySQL tipurile de date numerice pot fi împărţite în două clase:

9
 tipuri de date numerice exacte - permit reprezentarea unei valori în mod precis sub formă de număr întreg
sau fracţionar (ex: valoarea unei monede – 4,5136):
- TINYINT(M) – număr întreg foarte scurt, reprezentat pe 8 biţi; Domeniul de valori în cazul reprezentării cu

BD
semn este de la -128 până la 127. Domeniul de valori în cazul reprezentării fără semn (UNSIGNED) este de la
0 până la 255. Opţional se poate impune ca numărul să fie reprezentat din M cifre.
- SMALLINT(M) – număr întreg scurt, reprezentat pe 16 biţi; Domeniul de valori în cazul reprezentării cu
semn este de la -32768 până la 32767. Domeniul de valori în cazul reprezentării fără semn (UNSIGNED) este
de la 0 până la 65535. Opţional se poate impune ca numărul să fie reprezentat din M cifre.
- MEDIUMINT(M) – număr întreg de lungime medie, reprezentat pe 24 de biţi; Domeniul de valori în cazul
reprezentării cu semn este de la -8388608 până la 8388607. Domeniul de valori în cazul reprezentării fără
semn este de la 0 până la 16777215. Opţional se poate impune ca numărul să fie reprezentat din M cifre.
- INTEGER(M) sau prescurtat INT – reprezintă un număr întreg lung, reprezentat pe 32 de biţi; Domeniul de
valori în cazul reprezentării cu semn este de la -2147483648 până la 2147483647. Domeniul de valori în
cazul reprezentării fără semn este de la 0 până la 4294967295. Opţional se poate impune ca numărul să fie

or
reprezentat din M cifre.
- BIGINT(M) – reprezintă un număr întreg foarte lung, reprezentat pe 64 de biţi; Domeniul de valori în
cazul reprezentării cu semn este de la -9223372036854775808 până la 9223372036854775807. Domeniul
de valori în cazul reprezentării fără semn este de la 0 până la 18446744073709551615. Opţional se poate
impune ca numărul să fie reprezentat din M cifre.
- DECIMAL(M,Q) sau prescurtat DEC – defineşte un număr zecimal, unde M reprezintă numărul total de
rat
cifre care formează un număr, din care Q cifre după virgulă. Dacă valoarea lui Q nu este specificată, atunci
aceasta este considerată în mod predefinit 0. Dacă valoarea lui M nu este specificată, atunci aceasta este
considerată în mod predefinit 10. Valoarea maximă a lui M este 65, iar cea pentru Q este 30. Semnul (pentru
numere negative) şi punctul zecimal nu sunt luate în calcul când se specifică valoarea lui M sau a lui Q. De
exemplu, pentru o coloană definită ca DECIMAL(4, 2) se pot stoca valori pe 4 cifre dintre care două
reprezintă partea zecimală, iar domeniul de valori va fi între -99,99 şi 99,99.
- FIXED(M,Q) şi NUMERIC(M,Q) – sunt similare cu DECIMAL, dar au fost introduse pentru compatibilitate
cu alte sisteme de gestiune a bazelor de date.
bo

 tipuri de date aproximate – permite reprezentarea numerelor reale sub formă aproximată (de exemplu, un
număr precum PI va fi stocat ca un număr real, dar cu o anumită precizie):

- FLOAT(M,Q) – reprezintă un număr real, în virgulă mobilă, cu precizie simplă. Valorile sunt reprezentate
ca, de exemplu, 3,48E15 care este echivalent cu 3,48×1015. Valorile permise sunt: valori cuprinse între
-3.402823466E+38 şi -1.175494351E-38, 0, şi valori între 1.175494351E-38 şi 3.402823466E+38.
- DOUBLE(M,Q) – reprezintă un număr real, în virgulă mobilă, cu precizie dublă. Valorile permise sunt:
valori cuprinse între -1.7976931348623157E+308 şi -2.2250738585072014E-308, 0, şi valori cuprinse între
La

2.2250738585072014E-308 şi 1.7976931348623157E+308.
- REAL(M,Q) – este sinonim cu FLOAT(M,Q);

10
Toate valorile numerice pot fi negative sau pozitive. În cazul în care se doreşte ca o anumită coloană a unui tabel să
poată conţine numai numere pozitive, atunci se adaugă după tipul de date şi cuvântul cheie UNSIGNED. De exemplu,
coloana salariu din tabelul tblAngajati poate fi definită ca: salariu DECIMAL(7,2) UNSIGNED.

BD
Pentru tipul de date numerice, MySQL pune la dispoziţie atributul opţional ZEROFILL care permite adăugarea de
zerouri în faţa unui număr astfel încât să fie reprezentat pe un număr de cifre egal cu capacitatea maximă permisă de
tipul de date respectiv. De exemplu, coloana departament din tabelul tblAngajati reprezintă codul departamentului
în care este angajat un salariat. Dacă acest cod ar fi compus din 3 cifre de forma 00X, 0XX sau XXX, atunci se poate
folosi tipul de date SMALLINT cu parametrul M setat la valoarea 3. Pentru a păstra formatul specificat, chiar dacă
utilizatorul introduce un cod format dintr-o cifră sau două se poate folosi cuvântul cheie ZEROFILL care va permite
completarea codului cu un număr de zerouri corespunzător (ex: un cod 7 va fi transformat în 007). În consecinţă,
coloana departament din tabelul tblAngajati poate fi definită ca: departament SMALLINT(3) ZEROFILL. Folosirea
cuvântului cheie ZEROFILL pentru o coloană de tip numeric atrage după sine adăugarea atributului UNSIGNED.

• Date de tip şir de caractere

or
- CHAR(M) sau CHARACTER(M) – defineşte un şir de M caractere. Dacă informaţia ce trebuie stocată
depăşeşte cele M caractere, atunci aceasta va fi trunchiată. Dacă este mai mică de M caractere, atunci se vor
adăuga spaţii libere pentru completare. M poate lua şi valoarea 0. Acest lucru poate fi util atunci când se
urmăreşte păstrarea compatibilităţii cu versiuni de aplicaţii mai vechi care depind de existenţa unei coloane,
dar care nu folosesc efectiv valorile din ea.
- VARCHAR(M) sau CHARACTER VARYING(M) – defineşte un şir variabil de caractere de lungime
maximă M. În acest caz, lungimea şirului de caractere (şi implicit spaţiul de memorie necesar pentru stocare)
rat
se stabileşte adaptiv în funcţie de informaţia introdusă în coloană, dar nu poate depăşi valoarea lui M (se
realizează trunchiere).
Pentru a înţelege diferenţa dintre tipurile de date CHAR(M) şi VARCHAR(M) se poate analiza exemplul din
Tabelul I.1.
Tabelul I.1. Diferenţa între tipurile de date CHAR şi VARCHAR
Tipul de date Şirul de caractere ce se doreşte a fi stocat Şirul de caractere stocat
CHAR (40) “acesta este un sir de 37 de caractere ”
“acesta este un sir de 37 de caractere”
VARCHAR (40) “acesta este un sir de 37 de caractere”
bo

CHAR (40) “acesta este un sir care depaseste 40 car”


“acesta este un sir care depaseste 40 caractere”
VARCHAR (40) “acesta este un sir care depaseste 40 car”
*Nota: MySQL nu va permite stocarea unui şir de caractere dacă acesta are lungimea mai mare decât parametrul M

În marea majoritate a cazurilor este de preferat utilizarea tipului de date VARCHAR, deoarece lungimea şirului de
caractere nu este întotdeauna cunoscut a priori (spre exemplu numele unei persoane).
- TEXT – este similar cu tipul de date VARCHAR, dar elimină inconvenientul de a stabili numărul maxim de
caractere care poate fi stocat. În realitate, există o limită de maximum 65,535 (216 - 1) caractere. Pentru a
putea stoca şiruri de caractere şi mai mari se poate utiliza MEDIUMTEXT care permite stocarea a maximum
La

16,777,215 (224 − 1) caractere sau LONGTEXT cu o lungime de până la 4,294,967,295 (232 − 1) caractere,
echivalentul a 4GB. Există de asemenea şi varianta redusă TINYTEXT care poate stoca până la 257 de
caractere.
- BLOB – este similar cu tipul de date TEXT, cu singura diferenţă că ţine cont de literele mici şi mari (case
sensitive). Spre exemplu, dacă avem două şiruri de caractere “Popescu” şi “popescu” definite ca tip de date
11
TEXT, atunci o comparaţie între ele ar indica faptul că sunt identice, în timp ce dacă ar fi definite ca BLOB,
s-ar putea preciza că sunt diferite. Există de asemenea variantele: TINYBLOB, MEDIUMBLOB şi
LONGBLOB.

BD
• Date de tip calendaristic
- DATE – permite definirea datelor calendaristice sub formatul “AAAA-LL-ZZ”, unde AAAA reprezintă
anul, LL – luna şi ZZ – ziua (ex: “2020-02-22”). Spaţiul ocupat pentru stocarea unei date este de 3 octeţi.
- DATETIME – permite definirea datelor calendaristice şi a orei sub formatul “AAAA-LL-ZZ HH:MM:SS”.
unde AAAA reprezintă anul, LL – luna, ZZ – ziua, HH – ora, MM – minutul, SS - secunda. De exemplu:
“2020-02-22 11:23:10”. Spaţiul ocupat pentru stocarea unei date de tip DATETIME este de 8 octeţi.
- TIMESTAMP – permite stocarea datei şi a orei de manieră automată sub formatul “AAAA-LL-ZZ
HH:MM:SS” la crearea sau actualizarea unei informaţii.
- TIME – permite stocarea unui durate (sau al diferenţei de timp între două evenimente) reprezentată sub
forma “HH:MM:SS”. Intervalul stabilit pentru oră este între -838 şi 838. În cazul în care este necesară

or
stocarea unui durate de timp mai mare se poate folosi formatul “ZZ-HH:MM:SS”. În acest caz este necesară
conversia orelor în zile.
- YEAR – permite specificarea unui an între 1901 şi 2155. Totuşi anumite sisteme (care stochează timpul ca o
variabilă pe 32 de biţi) pot întâmpina dificultăţi în a salva date mai mari de 2037 din cauza unei erori
cunoscute sub numele de “Unix Millennium Bug”.
rat
• Date de tip enumerare
- ENUM – permite crearea de mulţimi de valori autorizate pentru elementele dintr-o coloană. De exemplu,
pentru un tabel tblMasini, poate exista un atribut culoare ce poate lua valori doar din mulţimea {‘alb’,
‘rosu’, ‘verde’, ‘albastra’, ‘portocalie’}; O astfel de coloană poate fi definită în următorul mod: culoare
ENUM(‘alb’, ‘rosu’, ‘verde’, ‘albastra’, ‘portocalie’). În momentul inserării unei noi linii în tabel se va
verifica dacă valoarea corespunzătoare coloanei culoare ia una şi numai una dintre valorile specificate de
enumerare.
- SET – este echivalent cu ENUM cu singura observaţie că atributul culoare corespunzător unei înregistrări
bo

poate lua mai multe valori din mulţimea specificată. Poate fi util, spre exemplu, în cazul în care se doreşte
înregistrarea maşinilor bicolore.

Notă: Spre deosebire de alte sisteme de gestiune a bazelor de date, MySQL nu suportă definirea de către utilizator a
unor noi tipuri de date.

Exercitiu 1: a) Creaţi o bază de date denumită bibliotecaDB.


b) Creaţi un tabel denumit tblCarti stabilind un set de atribute convenabile şi identificaţi tipurile de date potrivite
pentru fiecare atribut în parte.
La

c) Să se vizualizeze structura tabelului tblCarti.

Notă: Pentru a putea verifica/insera/modifica date în cadrul tabelelor vor fi redate în continuare câteva comenzi de
bază existente în MySQL, revenindu-se asupra lor în detaliu în laboratoarele următoare:

12
• Ştergere tabel:
DROP TABLE numeTabel;

BD
• Inserare înregistrare în tabel:
INSERT INTO numeTabel VALUES (valoareAtribut1, valoareAtribut2, …);

• Inserare înregistrare în tabel, dar asignare valori doar pentru anumite atribute:
INSERT INTO numeTabel (numeAtributX, NumeAtributY, …) VALUES (valoareAtributX, valoareAtributY, …);

• Modificare valoare atribut în funcţie de o condiţie:


UPDATE numeTabel SET numeAtribut = valoare WHERE condiţie;

• Vizualizarea conţinutului unui tabel:


SELECT * FROM numeTabel;

• Ştergerea unei înregistrări din tabel:

or
DELETE FROM numeTabel WHERE condiţie;

Notă: Deoarece introducerea comenzilor complexe în consola MySQL este dificilă, este recomandată scrierea lor
într-un editor de text (de exemplu: notepad++) şi rularea lor cu ajutorul comenzii:

mysql> source cale_catre_fisier/nume_fisier.sql;


rat
Exercitiu 2: Să se introducă în tabelul tblCarti trei înregistrări diferite, apoi să se vizualizeze conţinutul tabelului.

Exercitiu 3: Introduceţi în tabelul tblCarti înregistrări care au valori necorespunzătoare cu tipul de date şi domeniul
specificat pentru atributele definite.

Tipuri de constrângeri definite în MySQL

În momentul definirii unui tabel, pe lângă numele şi tipul coloanelor, se poate specifica opţional şi un set de
bo

constrângeri pe care valorile inserate trebuie să le satisfacă. Spre exemplu, pentru tabelul tblAngajati definit anterior,
s-a specificat constrângerea NOT NULL asociată atributului idAngajat, ceea ce înseamnă că această valoare nu
trebuie să lipsească în momentul inserării unei noi linii în tabel. În continuarea acestui capitol se vor detalia tipurile
de constrângeri care pot fi aplicate diverselor coloane dintr-un tabel.

1. Constrângerea NOT NULL

Constrângerea de tip NOT NULL asigură faptul că o coloană nu poate avea valori nule (NULL). Acest lucru impune
La

ca atunci când se adaugă o nouă înregistrare în tabel, să se cunoască deja valoarea corespunzătoare atributului
declarat de tip NOT NULL. De exemplu, pentru tabelul tblAngajati se poate impune ca atributul numeAngajat să fie
declarat NOT NULL astfel:

13
mysql> CREATE TABLE tblAngajati (
………
numeAngajat VARCHAR(50) NOT NULL,
………

BD
);

Exercitiu 4: a) Încercaţi inserarea unui tuplu pentru care atributul titlu să aibă valoarea NULL. Vizualizaţi
înregistrările din tabel.
b) Recreaţi tabelul tblCarti astfel încât atributul titlu să nu poată lua valori nule.
c) Încercaţi inserarea unui tuplu pentru care atributul titlu să aibă valoarea NULL.

2. Condiţia de unicitate

Constrângerea de unicitate (UNIQUE) impune ca într-o coloană a unui tabel, valorile corespunzătoare din tupluri
diferite să nu coincidă. Este permisă totuşi existenţa valorilor nule, dar numai dacă nu a fost aplicată şi constrângerea
NOT NULL pentru acea coloană. Valoarea NULL este considerată a nu fi echivalentă cu nimic, chiar nici cu ea
însăşi. De exemplu, pentru tabelul tblAngajati se poate impune ca atributul CNP să fie declarat UNIQUE astfel:

or
mysql> CREATE TABLE tblAngajati (
………
CNP VARCHAR(13) UNIQUE,
………
);
sau
mysql> CREATE TABLE tblAngajati (
rat
………
CNP VARCHAR(13),
………
CONSTRAINT unique_cnp UNIQUE(CNP)
);

În cel de-al doilea caz se poate observa utilizarea clauzei CONSTRAINT care permite atribuirea unui nume pentru
constrângerea definită (unique_cnp).

Exercitiu 5: a) Recreaţi tabelul tblCarti astfel încât atributul ISBN să fie declarat de tip UNIQUE.
bo

b) Încercaţi inserarea a două înregistrări pentru care atributul ISBN să fie identic.
c) Repetaţi exerciţiul folosind şi cea de-a doua metodă care utilizează clauza CONSTRAINT. Observaţi diferenţa faţă de
primul caz, atunci când se încearcă inserarea a două înregistrări cu ISBN diferit.

Constrângerea UNIQUE se poate aplica de asemenea mai multor coloane dintr-un tabel în acelaşi timp. În acest caz
nu vor fi permise noi înregistrări care încalcă simultan condiţia de unicitate.

mysql> CREATE TABLE tblAngajati (


………
La

numeAngajat VARCHAR(50),
………
dataNasterii DATE,
CONSTRAINT name_data UNIQUE(numeAngajat, dataNasterii)
);

14
Exercitiu 6: a) Recreaţi tabelul tblCarti astfel încât constrângerea UNIQUE să se aplice simultan pe atributele titlu şi
anPublicare.
b) Încercaţi inserarea a două înregistrări pentru care atributul titlu să fie identic. Este posibil acest lucru?
c) Încercaţi inserarea a două înregistrări pentru care atributul anPublicare să fie identic. Este posibil acest lucru?

BD
d) Încercaţi inserarea a două înregistrări pentru care atributul anPublicare să fie identic şi de asemenea anPublicare
să aibă aceeaşi valoare. Este posibil acest lucru?

3. Setarea valorilor predefinite pentru atribute

Cuvântul chei DEFAULT permite definirea unui atribut care să aibă o valoare implicită în cazul în care nu se
specifică una în momentul inserării unei înregistrări. În cazul în care nu se specifică o valoare predefinită, utilizând
clauza DEFAULT, atunci este asignată valoarea NULL în mod automat. Valorile specificate de către DEFAULT
trebuie să fie constante şi să fie compatibile cu tipul şi domeniul de valori ale atributului asupra căruia se aplică.

De exemplu, pentru tabelul tblAngajati se poate impune ca atributul salariu să aibă valoarea implicită 1400.00,
astfel:

or
mysql> CREATE TABLE tblAngajati (
………
salariu DECIMAL(7,2) DEFAULT 1400.00 ,
………
);

Notă: Pentru a insera o înregistrare în tabel, pentru care nu se doreşte introducerea valorii unui atribut, cu scopul de a
rat
se folosi valoarea predefinită, se pot folosi următoarele două sintaxe:
INSERT INTO numeTabel VALUES (valoareAtribut1, DEFAULT, valoareAtribut3, …);
SAU
INSERT INTO numeTabel (numeAtribut1, NumeAtribut3, …) VALUES (valoareAtribut1, valoareAtribut3, …);

În primul caz se observă utilizarea cuvântului cheie DEFAULT cu scopul de a evita introducerea unei valori pentru
(spre exemplu) atributul2, iar în cel de-al doilea caz se specifică atributele pentru care se introduc valori (omiţându-
se, spre exemplu, atributul2).
bo

Exercitiu 7: a) Recreaţi tabelul tblCarti astfel încât să se aplice constrângerea DEFAULT pentru atributul editura,
valoarea predefinită fiind Teora.
b) Inseraţi câte o înregistrare, prin cele două metode prezentate anterior, pentru care atributul editura să ia valoarea
predefinită.
c) Inseraţi o nouă înregistrare pentru care editura să aibă valoarea “Litera”. Mai este posibil acest lucru?

4. Definirea unei chei primare

În cadrul unui tabel, pentru garantarea unicităţii unei înregistrări (linii), care corespunde unei anumite informaţii
La

modelate din lumea reală, este necesară definirea a cel puţin unui identificator. Într-o relaţie (tabel) pot exista mai
mulţi identificatori (o coloană sau grup de coloane) care să diferenţieze în mod unic înregistrările dintr-un tabel.
Coloana aleasă să îndeplinească această funcţie este denumită cheie primară. În cadrul MySQL clauza folosită pentru
definirea cheii primare este PRIMARY KEY şi poate fi folosită în două moduri:

- în momentul definirii coloanei care reprezintă identificatorul primar:

15
mysql> CREATE TABLE tblAngajati (
idAngajat SMALLINT PRIMARY KEY,
……
);

BD
- sau la sfârşitul definirii tuturor atributelor specificând coloana care reprezintă cheia primară:
mysql> CREATE TABLE tblAngajati (
idAngajat SMALLINT,
……
dataNasterii DATE,
PRIMARY KEY (idAngajat)
);

În cazul în care se doreşte crearea unei chei primare pe baza informaţiilor din mai multe coloane, se poate folosi ce-a
de-a doua metodă prezentată anterior, specificând numele coloanelor.

mysql> CREATE TABLE tblAngajati (


idAngajat SMALLINT,

or
numeAngajat VARCHAR(50),
……
dataNasterii DATE,
PRIMARY KEY (numeAngajat, dataNasterii)
);

Exercitiu 8: a) Recreaţi tabelul tblCarti astfel încât să se definească o cheie primară.


b) Inseraţi două înregistrări pentru care atributul definit ca identificator primar să fie identic.
rat
5. Definirea unei chei străine

Cea mai importantă constrângere inter-relaţii o reprezintă constrângerea de tip referenţial care se stabileşte prin
definirea cheilor străine. Acest tip de constrângere creează o legătură între valorile unui atribut (sau atribute) dintr-un
tabel cu valorile atributelor dintr-un alt tabel. Constrângerile referenţiale asigură faptul că valoarea unei chei străine
pentru orice tuplu dintr-o relaţie (care referă) se regăseşte printre valorile cheii primare din relaţia referită.

De exemplu, dacă există un tabel tblDepartamente definit în MySQL astfel:


bo

mysql> CREATE TABLE tblDepartamente (


idDep SMALLINT PRIMARY KEY,
numeDep VARCHAR(50),
locatie VARCHAR(50)
);

atunci atributul departament din tabelul tblAngajati poate deveni cheie străină care să facă referire la valorile din
coloana idDep a tabelului tblDepartamente. În acest fel se restricţionează adăugarea de înregistrări în tabelul
La

tblAngajati care prin atributul departament nu fac referire la nici un departament existent în tblDepartamente. În
acest caz tblDepartamente este denumit tabel părinte (tabelul la care se face referire), iar tblAngajati este considerat
tabelul copil (tabelul din care se face referirea).

Observaţie: MySQL poate utiliza mai multe tipuri de motoare de stocare (storage engine) a tabelelor care permit
optimizarea bazei de date. Tipurile de motoare de stocare a tabelelor disponibile în MySQL sunt: InnoDB,
16
MRG_MYISAM, MEMORY, BLACKHOLE, MyISAM, etc. Lista completă poate fi vizualizată cu ajutorul
comenzii show engines. Cel mai important element care diferenţiază tipurile de motoare de stocare a tabelelor îl
reprezintă gradul de siguranţă în manipularea datelor. Modelul InnoDB este cel mai sigur din punct de vedere al

BD
asigurării constrângerilor impuse unor tabele. În mod predefinit, MySQL utilizează motorul MyISAM care permite
indexarea full-text şi oferă facilităţi de căutare, dar care nu interzice introducerea de înregistrări care încalcă
constrângerile referenţiale. Din acest motiv, pentru scopul acestui document, este de preferat modificarea motorului
utilizat de MySQL pentru crearea tabelelor. Pentru a realiza acest lucru este necesară modificarea documentului de
configurare „my.ini” prin adăugarea următoarei linii la sfârşitul fişierului:
default-storage-engine=InnoDB

Sintaxa folosită în MySQL pentru definirea unei chei străine în tabelul copil este:
CONSTRAINT fk_constr FOREIGN KEY (numeColoanaInTabelCopil)
REFERENCES numeTabelParinte (numeColoanaInTabelParinte)
[ON DELETE action]
[ON UPDATE action]

or
• CONSTRAINT – specifică numele constrângerii;
• FOREIGN KEY – specifică ce coloană din tabelul copil este cheie străină. Valorile din această coloană trebuie
să se potrivească cu valorile din coloana (cheie primară) la care se face referire în tabelul părinte;
• REFERENCES – specifică tabelul şi numele coloanei la care face referire cheia străină;
• ON DELETE – permite specificarea acţiunii care trebuie să aibă loc asupra înregistrărilor din tabela copil
atunci când se şterge o înregistrare referită din tabelul părinte. În MySQL există următoarele două opţiuni:
- ON DELETE CASCADE- permite eliminarea unui tuplu din tabela părinte, concomitent cu
rat
identificarea şi ştergerea tuturor liniilor din tabela copil care făceau referire la acea înregistrare;
- ON DELETE SET NULL - permite eliminarea unui tuplu din tabela părinte, concomitent cu
identificarea şi modificarea tuturor liniilor din tabela copil care făceau referire la acea înregistrare astfel
încât valorile cheii străine să ia valoarea NULL. Acest lucru este posibil doar dacă atributul cheie străină
nu este declarat facultativ;
- Nespecificat – în cazul în care clauza ON DELETE nu este folosită, atunci ştergerea unei înregistrări
din tabela părinte, care este referită într-o tabelă copil, nu va fi posibilă;
• ON UPDATE - permite specificarea acţiunii care trebuie să aibă loc asupra înregistrărilor din tabela copil
atunci când se modifică în tabelul părinte, valoarea cheii primare a unei înregistrări referite. Clauza ON
bo

UPDATE este similară cu clauza ON DELETE, cu diferenţa că acţionează atunci când este actualizată o
înregistrare în tabela părinte, nu atunci când este ştearsă.

Pentru a defini relaţia tblAngajati astfel încât să cuprindă cheia străină departament se poate folosi comanda:

mysql> CREATE TABLE tblAngajati (


idAngajat SMALLINT PRIMARY KEY,
numeAngajat VARCHAR(50),
departament SMALLINT,
La

functia CHAR(20),
salariu DECIMAL(7,2),
dataNasterii DATE,
CONSTRAINT fk_dep FOREIGN KEY (departament)
REFERENCES tblDepartamente(idDep) ON DELETE CASCADE ON UPDATE CASCADE
);

17
Exercitiu 9: a) Creaţi un tabel denumit tblEdituri stabilind un set de atribute convenabile şi identificaţi tipurile de
date potrivite pentru fiecare atribut în parte. Se va stabili o cheie primară care va respecta formatul XYZ (utilizând
clauza ZEROFILL).

BD
b) Să se introducă în tabelul tblEdituri trei înregistrări diferite, apoi să se vizualizeze conţinutul tabelului.
c) Recreaţi tabelul tblCarti astfel încât să se folosească o cheie străină codEditura care să facă referire la cheia primară
din relaţia tblEdituri. Cheia străină va fi creată având activate opţiunile ON DELETE CASCADE şi ON UPDATE
CASCADE.
d) Inseraţi 3 înregistrări în tabelul tblCarti astfel încât cheia străină codEditura să facă referire la codurile deja
existente în tabelul tblEdituri.
e) Inseraţi o înregistrare în tabelul tblCarti astfel încât cheia străină codEditura să NU facă referire la codurile deja
existente în tabelul tblEdituri.
f) Ştergeţi două înregistrări din tabelul tblEdituri. Vizualizaţi conţinutul celor două tabele. Specificaţi modificările
apărute.

5. Clauza AUTO_INCREMENT

Deşi nu este o constrângere în adevăratul sens al cuvântului, clauza AUTO_INCREMENT poate fi utilizată pentru a
constrânge valorile unui atribut să se incrementeze în mod automat, asigurând astfel unicitatea tuplurilor dintr-un

or
tabel. Clauza AUTO_INCREMENT permite generarea automată de numere unice, incrementate cu o unitate, pentru
atributul asociat, în momentul inserării de noi tupluri în tabelă. Această funcţionalitate este utilă de regulă pentru
generarea cheii primare astfel încât, utilizatorul/aplicaţia care inserează datele să nu aibă responsabilitatea asigurării
unui cod unic pentru fiecare înregistrare. De exemplu, pentru tabelul tblDepartamente se poate atribui coloanei
idDep clauza AUTO_INCREMENT, astfel:
rat
mysql> CREATE TABLE tblDepartamente (
idDep SMALLINT PRIMARY KEY AUTO_INCREMENT,
……
);

În mod predefinit valoarea de start pentru AUTO_INCREMENT este 1 şi realizează incrementarea cu 1 la fiecare
înregistrare adăugată.

Exercitiu 10: a) Recreaţi tabelul tblCarti astfel încât cheia primară să se autoincrementeze.
b) Inseraţi două înregistrări în tabelul tblCarti astfel încât valoarea pentru cheia primară să se genereze automat.
bo

c) Inseraţi o înregistrare în tabelul tblCarti astfel încât valoarea pentru cheia primară să fie 12.
d) Inseraţi o înregistrare în tabelul tblCarti astfel încât valoarea pentru cheia primară să se genereze automat. Care
este valoarea cheii primare pentru noua înregistrare?
La

18