Crearea şi gestionarea tabelelor. Definirea constrângerilor de integritate în SQL

Similar documents
Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

Titlul lucrării propuse pentru participarea la concursul pe tema securității informatice

[{CYCLE NOCYCLE}] [{CACHE

Metrici LPR interfatare cu Barix Barionet 50 -

CERERI SELECT PE O TABELA

5.1 Definirea datelor în SQL

Versionare - GIT ALIN ZAMFIROIU

ARBORI AVL. (denumiti dupa Adelson-Velskii si Landis, 1962)

Subinterogari SELECT salariul FROM angajaţi WHERE nume= Ionescu SELECT nume, prenume FROM angajaţi WHERE salariul>s

Procesarea Imaginilor

Proceduri stocate. Crearea procedurilor stocate. Varianta 1 În Management Studio se dă clic pe New Query ca în imaginea de mai jos: Fig.

2. Setări configurare acces la o cameră web conectată într-un router ZTE H218N sau H298N

Modalitǎţi de clasificare a datelor cantitative

Textul si imaginile din acest document sunt licentiate. Codul sursa din acest document este licentiat. Attribution-NonCommercial-NoDerivs CC BY-NC-ND

Baza de date: tabele, date. Componentele unei B.D.: tabele, constrangeri, relatii. Entitati ale unei B.D.: formulare, interogari, rapoarte

INTEROGĂRI ÎN SQL SERVER

Reflexia şi refracţia luminii. Aplicaţii. Valerica Baban

Semnale şi sisteme. Facultatea de Electronică şi Telecomunicaţii Departamentul de Comunicaţii (TC)

Proiectarea bazelor de date. PL/SQL Înregistrări și Colecții # 13. Adrian Runceanu

:= 950; BEGIN DELETE FROM

Proiectarea bazelor de date # 11. PL/SQL Funcții în PL/SQL (partea a II-a) Adrian Runceanu

Creare baza de data Deschidem aplicaţia Microsoft Access. Lansarea în execuţie a programului se face urmând calea:

Documentaţie Tehnică

MS POWER POINT. s.l.dr.ing.ciprian-bogdan Chirila

Colegiul Național Calistrat Hogaș Piatra-Neamț LIMBAJUL SQL

Ghid identificare versiune AWP, instalare AWP şi verificare importare certificat în Store-ul de Windows

CERERI SELECT PE MAI MULTE TABELE

Limbajul PL/SQL. Structura unui bloc PL/SQL este următoarea:

MICROSOFT ACCESS 2007 (DE CĂUTAT???)

Gruparea rezultatelor unei interogări

REVISTA NAŢIONALĂ DE INFORMATICĂ APLICATĂ INFO-PRACTIC

Subiecte Clasa a VI-a

Structura și Organizarea Calculatoarelor. Titular: BĂRBULESCU Lucian-Florentin

Nume şi Apelativ prenume Adresa Număr telefon Tip cont Dobânda Monetar iniţial final

Ce este o BAZA DE DATE?

Update firmware aparat foto

INFORMAȚII DESPRE PRODUS. FLEXIMARK Stainless steel FCC. Informații Included in FLEXIMARK sample bag (article no. M )

Reţele Neuronale Artificiale în MATLAB

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

La fereastra de autentificare trebuie executati urmatorii pasi: 1. Introduceti urmatoarele date: Utilizator: - <numarul dvs de carnet> (ex: "9",

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

Baze de date - Lucrare de laborator 3 -

Capitolul 4 SUBCERERI. F. Radulescu. Curs: Baze de date - Limbajul SQL

GHID DE TERMENI MEDIA

Arbori. Figura 1. struct ANOD { int val; ANOD* st; ANOD* dr; }; #include <stdio.h> #include <conio.h> struct ANOD { int val; ANOD* st; ANOD* dr; }

Subprograme şi pachete PL/SQL

Proprietăţi obiectual-relaţionale în standardul SQL prof. dr. ing. Mircea Petrescu

UNIVERSITATEA ŞTEFAN CEL MARE SUCEAVA

Dispozitive Electronice şi Electronică Analogică Suport curs 02 Metode de analiză a circuitelor electrice. Divizoare rezistive.

The First TST for the JBMO Satu Mare, April 6, 2018

Mecanismul de decontare a cererilor de plata

R O M Â N I A CURTEA CONSTITUŢIONALĂ

Olimpiad«Estonia, 2003

Capitolul IF.02. Structurarea bazelor de date

BAZE DE DATE Crearea, gestionarea şi exploatarea bazelor de date spaţiale

Excel Advanced. Curriculum. Școala Informală de IT. Educație Informală S.A.

D în această ordine a.î. AB 4 cm, AC 10 cm, BD 15cm

Auditul financiar la IMM-uri: de la limitare la oportunitate

UNIVERSITATEA DIN CRAIOVA FACULTATEA DE ELECTROMECANICĂ CATEDRA DE ACŢIONĂRI ELECTRICE. Şef lucrări dr. ing. Cătălin CONSTANTINESCU BAZE DE DATE

Managementul referinţelor cu

Lucrarea de laborator nr. 4

MICROSOFT OFFICE ACCESS

Baze de date distribuite și mobile

1 Vasile Violeta Ion Popescu Avram Maria Câmpuri în tabel

CHAMPIONS LEAGUE 2017 SPONSOR:

BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU

9. Memoria. Procesorul are o memorie cu o arhitectură pe două niveluri pentru memoria de program și de date.

Funcţii grup şi clauzele GROUP BY, HAVING. Operatorii ROLLUP şi CUBE.

Modulul 5 Baze de date

Propuneri pentru teme de licență

BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU

BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU

ADO.NET - note de curs pentru disciplina "Servere de date"

APLICAŢIE INFORMATICĂ PENTRU PREGĂTIREA MISIUNILOR DE NIVEL TACTIC

X-Fit S Manual de utilizare

CAPITOLUL 4. CREAREA UNEI BAZE DE DATE PRIN COMENZI SQL

Tehnologia OLAP. Prep. Daniela-Ioana SANDU, prep. Elena POSDARIE Catedra de Informatica Economica, A.S.E. Bucuresti

Itemi Sisteme de Operare

1. Date, informaţii, cunoştinţe Date Informaţii Cunoştinţele

Cap.5 Normalizarea relaţiilor

Universitatea George Bariţiu, Braşov

Laboratorul 3 Lucrul cu baze de date relaționate în Visual C#.NET

2. Setări configurare acces la o cameră web conectată într-un echipament HG8121H cu funcție activă de router

ISBN-13:

SGBD Access 2010: Query

Aspecte controversate în Procedura Insolvenţei şi posibile soluţii

O bază de date (database), este o colecţie de date creată şi

Candlesticks. 14 Martie Lector : Alexandru Preda, CFTe

Grafuri bipartite. Lecție de probă, informatică clasa a XI-a. Mihai Bărbulescu Facultatea de Automatică și Calculatoare, UPB

9. CURSOARE. Obiective. În acest Capitol, vom învăţa despre: Manipularea cursoarelor. Folosirea Cursor FOR Loops şi Nesting Cursors.

Updating the Nomographical Diagrams for Dimensioning the Concrete Slabs

Ghid pentru configurarea şi utilizarea aplicaţiei clicksign Demo

REVISTA NAŢIONALĂ DE INFORMATICĂ APLICATĂ INFO-PRACTIC

Laborator 1. Programare declarativă. Programare logică. Prolog. SWI-Prolog

I. CONCEPTE ALE BAZELOR DE DATE RELAŢIONALE

EN teava vopsita cu capete canelate tip VICTAULIC

INTERPRETOARE DE COMENZI

Universitatea Politehnica Bucureşti Facultatea de Automatică şi Calculatoare Departamentul de Automatică şi Ingineria Sistemelor LUCRARE DE LICENŢĂ

PROCEDURA PRIVIND DECONTURILE. 2. Domeniu de aplicare Procedura se aplică în cadrul Universităţii Tehnice Cluj-Napoca

PROIECT. La Baze de date. Evidența activității pentru o firmă IT. Îndrumător: ș. l. dr. ing. Mirela Danubianu. Efectuat de: Grigoriev Sergiu gr.

Transcription:

Crearea şi gestionarea elor. Definirea constrângerilor de integritate în SQL Obiective Scopul acestui referat este de a prezenta instrucńiunile LDD ce pot fi utilizate pentru modificarea schemei logice a unei baze de date (crearea de e, modificarea structurii unui, redenumirea unui ). De asemenea, este indicat modul în care pot fi utilizate constrângerile de integritate pentru a preveni introducerea unor date invalide în baza de date. După parcurgerea acestui referat, studentul va deńine cunoştinńele necesare: descrierii obiectelor din baza de date; pentru crearea unui ; descrierii tipurilor de date ce pot fi utilizate în momentul specificării definińiilor de coloane; modificării structurii unui ; ştergerii, redenumirii şi trunchierii elor. definirii constrângerilor de integritate; O bază de date Oracle poate conńine structuri de date multiple. Fiecare structură trebuie definită în faza de proiectare a bazei de date, astfel încât să poată fi creată în momentul construirii bazei de date. Tipurile de obiecte ale unei baze de date sunt date în ul următor. Obiect Tabel Vedere SecvenŃă Index Sinonim Descriere Unitatea de bază pentru stocarea datelor; compusă din linii şi coloane. Reprezentare logică a unei submulńimi de date dintr-unul sau mai multe e. Generează valori pentru chei primare. ÎmbunătăŃeşte performanńele în cazul unor interogări. Furnizează alte nume obiectelor. InstrucŃiunea CREATE TABLE Această instrucńiune face parte din Limbajul de Definire a Datelor (LDD) şi permite crearea unui în care vor fi stocate date. În general, instrucńiunile LDD reprezintă o submulńime a instrucńiunilor SQL şi sunt utilizate pentru crearea, modificarea şi ştergerea obiectelor unei baze de date Oracle. Pentru ca un utilizator să poată crea un, el trebuie să deńină dreptul CREATE TABLE şi o zonă de stocare în care va crea obiecte de tip. Dreptul de a crea un este acordat de administratorul bazei de date prin intermediul instrucńiunilor LCD (Limbajul de Control al Datelor) GRANT şi REVOKE. Sintaxa instrucńiunii CREATE TABLE este următoarea: CREATE TABLE [schema.] (col tip_date [DEFAULT expr] [, col tip_date [DEFAULT expr]...]); schema DEFAULT expr col tip_date coincide cu numele utilizatorului proprietar al ului; numele ului; specifică o valoare implicită; numele coloanei; tipul de date şi lungimea coloanei col. ConvenŃii pentru denumirea elor numele trebuie sa înceapă cu o literă; numele unui poate avea lungimea de 1-30 caractere; 1

caracterele permise sunt numai A-Z, a-z, 0-9, _, $ şi #; numele unui nu trebuie să coincidă cu numele altor obiecte din baza de date (obiecte ale aceluiaşi utilizator); nu trebuie sa fie un nume rezervat Oracle. OpŃiunea DEFAULT Unei coloane i se poate asigna o valoare implicită utilizând opńiunea DEFAULT. Această opńiune previne introducerea unor valori NULL în în cazul inserării unei linii care nu specifică o valoare pentru coloana în cauză. Valoarea implicită poate fi o valoare literală, o expresie sau o funcńie SQL, cum ar fi SYSDATE sau USER, dar nu poate fi cea a unei alte coloane sau o pseudocoloană (cum ar fi NEXTVAL sau CURRVAL vezi secńiunea opńională referitoare la secvenńe). Valoarea implicită trebuie să corespundă tipului de date al coloanei. hiredate DATE DEFAULT SYSDATE, Pentru coloana hiredate s-a definit valoarea implicită returnată de funcńia SYSDATE (data sistemului). Exemplul următor creează ul dept, având trei coloane: DEPTNO, DNAME şi LOC. SQL> CREATE TABLE DEPT 2 (deptno NUMBER(2), Table created. 3 dname VARCHAR(14), 4 loc VARCHAR(13)); SQL> DESCRIBE dept Name Null? Type ---------------- --------- ---------- DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR(14) LOC VARCHAR(13) Interogarea dicńionarului de date Rezultatele execuńiei instrucńiunilor LDD sunt memorate în dicńionarul de date. Prin interogarea dicńionarului de date se pot obńine diverse informańii despre obiectele aparńinând unui utilizator. Tabelele cele mai utilizate din dicńionarul de date sunt USER_TABLES (conńine informańii despre ele create de utilizatorul curent), USER_OBJECTS (conńine informańii despre toate obiectele create de utilizatorul curent) şi USER_CATALOG. Afişarea elor unui utilizator: SQL> SELECT table_name 2 FROM user_tables; Afişarea obiectelor distincte aparńinând unui utilizator: SQL> SELECT DISTINCT object_name, object_type 2 FROM user_objects; Afişarea elor, vederilor, sinonimelor şi secvenńelor unui utilizator: SQL> SELECT * 2 FROM user_catalog; Deoarece ul USER_CATALOG are definit un sinonim, numit CAT, se poate folosi acest nume în loc de USER_CATALOG. SQL> SELECT * 2 FROM CAT; 2

Tipurile de date ce pot fi utilizate în definińiile de coloane sunt prezentate în ul următor: Tipul de data Descriere VARCHAR2(size) Dată de tip şir de caractere, de lungime variabilă (trebuie specificată dimensiunea maximă size; valoarea implicită este 1, iar cea maximă 4000) CHAR(size) Dată de tip şir de caractere de lungime size fixă (valoarea implicită şi cea minimă este 1, iar cea maximă 2000) NUMBER(p,s) Număr având p cifre şi s cifre zecimale. (p poate lua valori între 1 şi 38, s între 84 şi 127) DATE Valori de tip dată calendaristică şi timp cuprinse între Ianuarie 1, 4712 B.C. şi Decembrie 31, 9999 A.D. LONG Dată de tip şir de caractere de lungime variabilă, dimensiunea maximă fiind 2 Gb. CLOB Dată de tip şir de caractere pe 1 octet, dimensiunea maximă fiind 4 Gb. RAW(size) Dată binară de dimensiune size octeńi. Dimensiunea maximă este de 2000 octeńi. Valoarea size trebuie specificată. LONG RAW Dată binară de dimensiune maximă 2 Gb. BLOB BFILE Dată binară de dimensiune maximă 4 Gb. ConŃine un pointer către un fişier binar extern bazei de date ce poate avea dimensiunea maximă de 4 Gb. Crearea unui utilizând o subinterogare A doua metodă de creare a unui constă în utilizarea clauzei AS subinterogare în instrucńiunea CREATE TABLE, care creează ul şi inserează înregistrările furnizate de subinterogare. Sintaxa acestei instrucńiuni este: SQL> CREATE TABLE 2 (coloana [, coloana ]) 3 AS subinterogare; coloana numele ului; numele coloanei împreună cu valoare implicită şi constrângeri de integritate (ultimele două elemente sunt opńionale); subinterogare instrucńiunea SELECT care furnizează mulńimea de înregistrări ce trebuie inserate în. InstrucŃiunea următoare creează ul dept30, inserând informańii despre angajańii ce lucrează în departamentul 30. Structura ului dept30 este dată de lista de coloane din clauza SELECT. SQL> CREATE TABLE dept30 2 AS 3 SELECT empno, ename, sal*12 ANNSAL, hiredate Table created. 4 FROM emp 5 WHERE deptno=30; SQL> DESCRIBE dept30 Name Null? Type ----------- ------------- ----------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR(10) ANNSAL NUMBER HIREDATE DATE InstrucŃiunea ALTER TABLE Această instrucńiune este utilă dacă se urmăreşte modificarea structurii unui prin: adăugarea unei coloane; 3

ştergerea unei coloane; modificarea definińiei unei coloane existente; definirea unei valori implicite pentru o coloană. Pentru adăugarea unei coloane se va utiliza instrucńiunea ALTER TABLE împreună cu clauza ADD, iar pentru modificarea unei coloane se va utiliza clauza MODIFY. Dacă se doreşte eliminarea unor coloane din definińia ului se va utiliza clauza DROP. SQL> ALTER TABLE 2 ADD (coloana tip_date [DEFAULT expr] 3 [, coloana tip_date...]); SQL> ALTER TABLE 2 MODIFY (coloana tip_date [DEFAULT expr] 3 [, coloana tip_date...]); SQL> ALTER TABLE 2 DROP (coloana [, coloana ]); coloana tip_date DEFAULT expr nume ; nume coloană; tipul de date şi dimensiunea; specifică valoarea implicită pentru coloană. Următorul exemplu introduce o nouă coloană în ul emp30, numele acestei coloane fiind job, iar tipul de date asociat este varchar(9). Pentru verificare se utilizează instrucńiunea SELECT. SQL> ALTER TABLE dept30 2 ADD (job VARCHAR(9)); Table altered. SQL> SELECT * FROM dept30; EMPNO ENAME ANNSAL HIREDATE JOB ------ -------- ------- --------- ----- 7698 BLAKE 34200 01-MAY-81 7654 MARTIN 15000 28-SEP-81 7499 ALLEN 19200 20-FEB-81 7844 TURNER 18000 08-SEP-81 6 rows selected ObservaŃii: Cu ajutorul instrucńiunii ALTER TABLE se pot adăuga, modifica şi şterge coloane În cazul inserării unei coloane nu se poate specifica locul de aparińie al acesteia în schema ului. Noua coloană devine automat ultima coloană. Dacă ul conńine înregistrări în momentul adăugării unei coloane noi, atunci noua coloană va fi inińializată cu valori NULL pentru toate înregistrările. Se pot modifica specificańiile coloanelor utilizând instrucńiunea ALTER TABLE cu clauza MODIFY. Modificările permise sunt schimbarea tipului de date, a dimensiunii, a valorii inińiale şi impunerea unei constrângeri NOT NULL. SQL> ALTER TABLE dept30 2 MODIFY (ename VARCHAR(15)); Table altered. ObservaŃii: se poate mări precizia sau scala unei coloane numerice; 4

se poate micşora lăńimea unei coloane dacă aceasta conńine numai valori NULL sau dacă ul nu are înregistrări; se poate schimba tipul de date dacă în coloana respectivă există numai valori NULL; se poate converti o coloană de tip CHAR la tipul VARCHAR2 sau invers dacă aceasta conńine valori NULL sau dacă nu se modifică lăńimea; schimbarea valorii implicite pentru o coloană afectează numai inserările ulterioare în. Ştergerea unui Comanda DROP TABLE şterge definińia unui. Atunci când se şterge un, baza de date pierde toate înregistrările din, împreună cu indecşii asociańi acestuia. Sintaxa instrucńiunii DROP TABLE este: DROP TABLE nume_; Exemplu: SQL> DROP TABLE dept30; Table dropped. ObservaŃii: toate datele sunt şterse; orice obiect dependent de (vedere sau sinonim) va continua să existe, dar va fi invalid; orice tranzacńie în curs va fi finalizată; numai utilizatorul care a creat ul sau cel care are privilegiul DROP ANY TABLE poate şterge un. Redenumirea unui obiect din baza de date Pentru a modifica numele unui, a unei vederi, secvenńe sau sinonim se utilizează instrucńiunea RENAME. RENAME nume_vechi TO nume_nou; Exemplu: SQL> RENAME dept30 TO department; Notă: Numai proprietarul poate modifica numele unui obiect. Table renamed. Trunchierea unui InstrucŃiunea TRUNCATE TABLE face parte din LDD şi şterge toate înregistrările din ul specificat, eliberând spańiul folosit de. OperaŃiunea este ireversibilă, în sensul că instrucńiunea ROLLBACK nu va restaura conńinutul ului. TRUNCATE TABLE nume_; Exemplu: SQL> TRUNCATE TABLE department; Table truncated. Pentru ştergerea înregistrărilor dintr-un se poate utiliza instrucńiunea DELETE, dar aceasta instrucńiune nu eliberează spańiul de stocare. Adăugarea comentariilor de şi de coloană Se pot adăuga comentarii având maxim 2000 octeńi unei coloane, unui sau unei vederi utilizând instrucńiunea COMMENT. COMMENT ON <TABLE COLUMN.col> IS text; 5

numele ului; col numele coloanei din ; text textul comentariului, încadrat de apostrofuri ( ). Comentariile sunt stocate în dicńionarul de date şi pot fi vizualizate în coloana COMMENTS a uneia din următoarele vederi: - ALL_COL_COMMENTS; - conńine toate comentariile de coloane - USER_COL_COMMENTS; - conńine comentariile asociate coloanelor utilizatorului curent - ALL_TAB_COMMENTS; - conńine toate comentariile de e - USER_TAB_COMMENTS. - conńine toate comentariile asociate elor utilizatorului curent SQL> COMMENT ON TABLE emp 2 IS Employee Information ; Comment created. Se poate renunńa la un comentariu, setându-l ca fiind şirul vid ( ). SQL> COMMENT ON TABLE emp IS ; Impunerea constrângerilor de integritate în SQL Serverul Oracle utilizează constrângerile de integritate pentru prevenirea introducerii unor date invalide în e. Constrângerile pot fi utilizate pentru: - forńarea unor reguli la nivel de atunci când o linie este inserată, actualizată sau ştearsă; constrângerea trebuie satisfăcută pentru ca operańia să se termine cu succes. - prevenirea ştergerii unui dacă există dependenńe din alte e. - oferirea unor reguli pentru alte medii Oracle, cum ar fi Developer/2000. Există cinci tipuri de constrângeri de integritate ce pot fi impuse: - NOT NULL - specifică faptul că o coloană nu poate conńine o valoare NULL; - UNIQUE - specifică o coloană (o combinańie de coloane) a cărei valoare (combinańie de valori) trebuie să fie unică pentru toate înregistrările din ; - PRIMARY KEY - identifică unic fiecare înregistrare; - FOREIGN KEY - stabileşte o legătură pe baza unei chei externe între o coloană din şi o coloană din ul referit; - CHECK - specifică o condińie ce trebuie satisfăcută de fiecare înregistrare. Toate constrângerile definite de un utilizator sunt păstrate în dicńionarul de date. Pentru vizualizarea constrângerilor impuse unui putem interoga dicńionarul de date, mai exact vederea USER_CONSTRAINTS. Definirea constrângerilor Sintaxa instrucńiunii CREATE ce impune constrângeri asupra unei coloane sau asupra unui este: CREATE TABLE [schema.] ( coloana tip_date [DEFAULT expr] [constrangere_coloana], [constrangere_]); schema DEFAULT expr coloana tip_date numele utilizatorului proprietar; numele ului; specifică o valoare implicită, dacă este omisă o valoare pentru atribut la inserare; numele coloanei; tipul de date şi dimensiunea; 6

constrangere_coloana constrangere_ constrângere de integritate ca parte a definińiei de coloană; constrângere de integritate ca parte a definińiei ului. CREATE TABLE emp (empno NUMBER(4), deptno NUMBER(7,2) NOT NULL, CONSTRAINT emp_empno_pk PRIMARY KEY (EMPNO)); Constrângerile sunt de obicei definite în acelaşi timp cu ul. Ele pot fi adăugate şi după crearea ului cu ajutorul instrucńiunii ALTER TABLE. Constrângerile pot fi definite la unul din următoarele două nivele: Nivel constrângere Coloană Tabel Descriere face referire la o singură coloană şi poate defini orice tip de constrângere face referire la una sau mai multe coloane şi este definită separat de definińiile coloanelor din ; poate defini orice tip de constrângere, cu excepńia constrângerii NOT NULL Constrângere la nivel de coloană coloana [CONSTRAINT nume_constrangere] tip_constrangere Constrângere la nivel de coloana,... [CONSTRAINT nume_constrangere] tip_constrangere (coloana,...),... nume_constrangere tip_constrangere este numele constrângerii; este tipul constrângerii. În definińia constrângerii utilizatorul poate furniza un nume sugestiv pentru aceasta. În acest caz constrângerea trebuie definită la nivel de. Dacă unei constrângeri nu i se furnizează un nume, serverul Oracle generează un nume după formatul SYS_Cn, unde n este un întreg care determină unicitatea numelui. Constrângerea NOT NULL Constrângerea NOT NULL indică faptul că valoarea NULL nu este permisă în coloana afectată de constrângere. Coloanele fără constrângeri NOT NULL pot conńine, implicit, valori NULL. EMP EMPNO ENAME JOB COMM DEPTNO 7839 KING PRESIDENT 10 7698 BLAKE MANAGER 30 7782 CLARK MANAGER 10 7566 JONES MANAGER 20 Constrângere NOT NULL (nici o înregistrare nu poate conńine o valoare NULL în această coloană) AbsenŃa constrângerii NOT NULL (orice înregistrare poate conńine valoarea NULL pentru această coloană) Constrângere NOT NULL Constrângerea NOT NULL poate fi specificată numai la nivel de coloană. 7

SQL> CREATE TABLE emp( 2 empno NUMBER(4) 3 ename VARCHAR2(10) NOT NULL 4 job VARCHAR2(9) 5 mgr NUMBER(4) 6 hiredate DATE 7 sal NUMBER(7,2) 8 comm NUMBER(7,2) 9 deptno NUMBER(7,2) NOT NULL); În exemplul de mai sus se aplică constrângerea NOT NULL coloanelor ename şi deptno din ul emp. Deoarece aceste constrângeri nu au nume, server-ul Oracle va crea automat nume pentru ele. Numele unei constrângeri poate fi indicat în definińia constrângerii, doar dacă aceasta apare la nivelul ului (după definirea tuturor coloanelor): deptno NUMBER(7,2) CONSTRAINT emp_deptno_nn NOT NULL Constrângerea UNIQUE constrângere UNIQUE DEPT DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON Insert 50 SALES DETROIT 60 BOSTON nu e permisă ( DNAME= SALES există deja) Permisă O constrângere de integritate de tip cheie unică cere ca fiecare valoare din coloană sau din mulńimea de coloane să fie unice două înregistrări ale ului nu pot avea valori duplicat corespunzătoare cheii unice. Coloana (mulńimea de coloane) inclusă în definińia cheii unice se numeşte cheie unică. Dacă o cheie unică conńine mai multe coloane se numeşte cheie unică compusă. O constrângere de tip cheie unică permite introducerea valorilor NULL dacă nu a fost definită o constrângere NOT NULL pentru acea coloană. De fapt, orice număr de înregistrări pot include valori NULL în coloane fără constrângeri NOT NULL, deoarece valorile NULL nu sunt egale cu nimic. O valoare NULL într-o coloană (sau în toate coloanele unei chei unice compuse) va satisface întotdeauna o constrângere de cheie unică. Notă: Din cauza mecanismului de căutare a constrângerilor UNIQUE în una sau mai multe coloane, nu este permisă existenńa unor valori identice în coloanele NOT NULL a unei constrângeri de cheie unică compusă. Constrângerea de tip cheie unică (UNIQUE) definită la nivel de sau de coloană Constrângerile de tip cheie unică pot fi definite la nivel de coloană sau de. O cheie unică compusă este creată utilizând definińia la nivel de (după definirea tuturor coloanelor). 8

SQL> CREATE TABLE dept( 2 deptno NUMBER(2), 3 dname VARCHAR(14), 4 loc VARCHAR(13), 5 CONSTRAINT dept_dname_uk UNIQUE(dname)); În exemplul anterior se aplică constrângerea de cheie unică coloanei dname din ul dept, numele constrângerii fiind DEPT_DNAME_UK. Notă: Serverul Oracle forńează implicit constrângerea de cheie unică în momentul creării unui index unic după cheia unică. Constrângerea PRIMARY KEY Constrângerea de cheie primară creează o cheie primară pentru. Doar o singură cheie primară poate fi creată pentru un anumit. O cheie primară este o coloană sau mulńime de coloane ce identifică unic fiecare înregistrare din. Această constrângere forńează unicitatea coloanei sau a mulńimii de coloane şi asigură că nici o coloană din cheia primară nu poate conńine valoarea NULL. PRIMARY KEY DEPT DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON INSERT 20 MARKETING DALLAS FINANCE NEW YORK Nu este permisă (DEPTNO=20 există deja) Nu este permisă (DEPTNO este NULL) Constrângerea cheii primare definită la nivel de coloană sau de Constrângerea de cheie primară (PRIMARY KEY) poate fi definită la nivel de (dacă implică mai multe coloane sau dacă i se atribuie un nume) sau de coloană (implică o singură coloană şi este nedenumită). O cheie primară compusă este creată utilizând definińia la nivel de. SQL> CREATE TABLE dept( 2 deptno NUMBER(2), 3 dname VARCHAR2(14), 4 loc VARCHAR2(13), 5 CONSTRAINT dept_dname_uk UNIQUE (dname), 6 CONSTRAINT dept_deptno_pk PRIMARY KEY(deptno)); Exemplul de mai sus defineşte o cheie primară formată din coloana deptno din ul dept. Numele constrângerii este DEPT_DEPTNO_PK. Notă: Un index unic este creat automat pentru o coloană cheie primară. Constrângerea FOREIGN KEY (sau de referinńă) Valoarea unei chei externe trebuie să coincidă cu o valoare deja existentă în ul părinte 9

sau să fie NULL. PRIMARY KEY DEPT DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS. EMP EMPNO ENAME JOB COMM DEPTNO 7839 KING PRESIDENT 10 7698 BLAKE MANAGER 30 FOREIGN KEY INSERT 7571 FORD MANAGER 200 9 7571 FORD MANAGER 200 Nu este permisă (DEPTNO=9 nu există în ul DEPT) Permisă ObservaŃie: Cheile externe sunt bazate pe valorile datelor din cele două e şi sunt pointeri pur logici, nu fizici. Constrângere de referinńă definită la nivel de coloană sau Constrângerile de chei externe pot fi definite la nivelul unui sau unei coloane. O cheie externă compusă este creată folosind definińia la nivel de. SQL> CREATE TABLE emp( 2 empno NUMBER(4), 3 ename VARCHAR2(10) NOT NULL, 4 job VARCHAR2(9), 5 mgr NUMBER(4), 6 hiredate DATE, 7 sal NUMBER(7,2), 8 comm NUMBER(7,2), 9 deptno NUMBER(7,2) NOT NULL, 10 CONSTRAINT emp_detpno_fk FOREIGN KEY (deptno) REFERENCES dept (deptno)); Exemplul de mai sus defineşte o constrângere de tip cheie externă pe coloana deptno din ul emp. Numele constrângerii este EMP_DEPTNO_FK. Sintaxa constrângerii de referinńă este următoarea: [CONSTRAINT nume_constr] FOREIGN KEY (col,...) REFERENCES _referit (col,...) [ON DELETE <CASCADE SET NULL>] FOREIGN KEY Defineşte coloana din ul copil la nivelul constrângerii de. REFERENCES Identifică ul părinte şi coloana din ul părinte. ON DELETE CASCADE Indică faptul că în situańia în care se şterge o linie din ul părinte, liniile dependente din ul copil vor fi şterse. ON DELETE SET NULL Dacă se şterge o linie din ul părinte, liniile dependente din ul copil vor primi valori 10

NULL în coloanele implicate în constrângere. Fără opńiunea ON DELETE CASCADE SET NULL linia din ul părinte nu va putea fi ştearsă dacă este referită în ul copil. Constrângerea CHECK Constrângerea de tip CHECK defineşte o condińie ce trebuie îndeplinită de fiecare linie dintr-un. CondiŃia poate utiliza aceleaşi construcńii ca şi condińiile de interogare, cu următoarele excepńii: referiri la pseudocoloanele CURRVAL, NEXTVAL, LEVEL şi ROWNUM. apeluri de funcńii SYSDATE, UID, USER şi USERENV. interogări care fac referire la alte valori din alte rânduri. Nu există o limitare pentru numărul de constrângeri CHECK ce pot fi definite pe o coloană. Constrângerile CHECK pot fi definite la nivel de coloană sau de. Exemplul de mai jos defineşte o constrângere CHECK pentru coloana deptno din ul emp, condińia constrângerii fiind ca valoarea din coloană să fie cuprinsă între 10 şi 99., deptno NUMBER(2), CONSTRAINT emp_deptno_ck CHECK (DEPTNO BETWEEN 10 AND 99) Adăugarea unei constrângeri Adăugarea unei constrângeri la un deja existent se face cu instrucńiunea ALTER TABLE cu clauza ADD. ALTER TABLE ADD [ CONSTRAINT nume_constrangere] tip (coloana); nume_constrangere tip coloana este numele ului este numele constrângerii este tipul constrângerii este numele coloanei afectată de constrângere Atentie! Deşi denumirea constrângerilor este opńională este recomandată furnizarea unor nume. În caz contrar va fi generat un nume de către sistem. ObservaŃii: se poate adăuga, şterge, activa sau dezactiva o constrângere, dar nu se poate modifica definińia acesteia. se poate adăuga o constrângere de tip NOT NULL la o coloană existentă folosind clauza MODIFY din instrucńiunea ALTER TABLE. Exemplul următor creează o constrângere de referinńă (FOREIGN KEY) în ul emp. Impunerea acestei constrângeri externe indică faptul că un manager trebuie să existe ca angajat activ în ul EMP. SQL> ALTER TABLE emp 2 ADD CONSTRAINT emp_mgr_fk Table altered. 3 FOREIGN KEY(mgr) REFERENCES emp(empno); Eliminarea unei constrângeri Pentru a elimina o constrângere trebuie identificat numele constrângerii. Această identificare se poate face cu ajutorul vederilor USER_CONSTRAINTS şi USER_CONS_COLUMNS din 11

dicńionarul de date. Odată identificat numele constrângerii se va utiliza instrucńiunea ALTER TABLE împreuna cu clauza DROP. ALTER TABLE DROP PRIMARY KEY UNIQUE (coloana) CONSTRAINT nume_constrangere [CASCADE]; coloana nume_constrangere este numele ului este numele coloanei afectată de constrângere este numele constrângerii. OpŃiunea CASCADE din clauza DROP are ca efect eliminarea tuturor constrângerilor dependente. Atentie: Când se elimină o constrângere de integritate, aceasta nu mai este folosită de către serverul Oracle şi nu mai este disponibilă în dicńionarul de date. Pentru eliminarea constrângerii în raport cu managerii din ul emp se va utiliza instrucńiunea SQL> ALTER TABLE emp 2 DROP CONSTRAINT emp_mgr_fk; Table altered. Pentru eliminarea constrângerii de tip cheie primară din ul dept, împreună cu constrângerea externă asociată coloanei deptno se poate folosi instrucńiunea: SQL> ALTER TABLE dept 2 DROP PRIMARY KEY CASCADE; Table altered. Dezactivarea constrângerilor Se poate dezactiva o constrângere fără să fie necesară eliminarea acesteia sau recrearea sa folosind instrucńiunea ALTER TABLE împreuna cu clauza DISABLE. ALTER TABLE DISABLE CONSTRAINT nume_constrangere [CASCADE]; nume_constrangere este numele ului este numele constrângerii. Notă: - clauza DISABLE se poate folosi atât în instrucńiunea CREATE TABLE, cât şi în instrucńiunea ALTER TABLE. - clauza CASCADE dezactivează constrângerile de integritate dependente. Exemplul următor dezactivează constrângerea de tip cheie primară din ul emp. Prin utilizarea clauzei CASCADE vor fi dezactivate toate constrângerile dependente. SQL> ALTER TABLE emp 2 DISABLE CONSTRAINT emp_empno_pk CASCADE; Table altered. Pentru verificare se va afişa valoarea din coloana STATUS din vederea USER_CONSTRAINTS pentru constrângerea în cauză. Dacă este afişată valoarea ENABLED atunci constrângerea este activată. În cazul în care constrângerea este dezactivată se va afişa valoarea DISABLED. Activarea unei constrângere dezactivate se face prin utilizarea instrucńiunii ALTER TABLE împreuna cu clauza ENABLE. ALTER TABLE ENABLE CONSTRAINT nume_constrangere; 12

nume_constrangere este numele ului. este numele constrângerii. Notă: - dacă se activează o constrângere, constrângerea va fi aplicată tuturor datelor din. Toate datele din trebuie să satisfacă constrângerea. - dacă se activează o constrângere de tip UNIQUE sau PRIMARY KEY, atunci este creat în mod automat un index UNIQUE sau PRIMARY KEY. - clauza ENABLE se poate folosi atât în instrucńiunea CREATE TABLE, cât şi în instrucńiunea ALTER TABLE. Exemplu: SQL> ALTER TABLE emp 2 ENABLE CONSTRAINT emp_empno_pk; Table altered. Vizualizarea constrângerilor După crearea unui, se poate confirma existenńa sa prin folosirea instrucńiunii DESCRIBE. Singura constrângere care poate fi verificată în acest mod este constrângerea NOT NULL. Pentru a vedea toate constrângerile din, este necesară interogarea ului USER_CONSTRAINTS. Exemplul următor afişează toate constrângerile definite în ul EMP. SQL> SELECT constraint_name, constraint_type, 2 search_condition 3 FROM user_constraints 4 WHERE table_name= EMP ; CONSTRAINT_NAME C SEARCH_CONDITION ---------------- - ---------------- SYS_C00674 C EMPNO IS NOT NULL SYS_C00675 C DEPTNO IS NOT NULL EMP_EMPNO_PK P Notă: Constrângerilor care nu primesc un nume de la proprietarul ului li se atribuie un nume automat de către sistem. Coloana C indică 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ă o constrângere NOT NULL este de fapt o constrângere de tip CHECK. Vizualizarea coloanelor asociate constrângerilor Pentru vizualizarea numelor coloanelor implicate în constrângeri se va interoga vederea USER_CONS_COLUMNS din dicńionarul de date. Această vizualizare este utilă în cazul utilizării mecanismului de asociere automată a numelor pentru contrângeri de către sistem. SQL> SELECT constraint_name, column_name, 2 FROM user_cons_columns 3 WHERE table_name= EMP ; CONSTRAINT_NAME COLUMN_NAME ---------------- ----------- EMP_DEPTNO_FK DEPTNO EMP_EMPNO_PK EMPNO EMP_MGR_FK MGR SYS_C00674 EMPNO SYS_C00675 DEPTNO 13

Probleme: 1. CreaŃi ul DEPARTMENT având structura din ul următor. SalvaŃi instrucńiunea în scriptul p1.sql, executańi scriptul şi verificańi crearea ului. Column Name Id Name Nulls/Unique Datatype Number Varchar2 Length 7 25 2. IntroduceŃi înregistrări în ul DEPARTMENT folosind înregistrările din ul DEPT. IncludeŃi doar coloanele de care aveńi nevoie. 3. CreaŃi ul EMPLOYEE având structura din ul următor. SalvaŃi instrucńiunea în fişierul script p3.sql şi apoi executańi scriptul. Column Name ID LAST_NAME FIRST_NAME DEPT_ID Nulls/Unique Datatype Number Varchar2 Varchar2 Number Length 7 10 25 7 4. ModificaŃi ul EMPLOYEE pentru a permite stocarea unor nume mai lungi (de exemplu de lungime 25 de caractere) în coloana LAST_NAME. 5. VerificaŃi că cele două e create sunt stocate în dicńionarul de date (IndicaŃie: afişańi datele de interes din vederea USER_TABLES). 6. CreaŃi ul EMPLOYEE2 având aceeaşi structură ca şi ul EMP, incluzând doar coloanele EMPNO, ENAME şi DEPTNO. RedenumiŃi coloanele în noul astfel: ID, LAST_NAME, DEPT_ID. Se vor prelua înregistrările din ul emp. 7. ŞtergeŃi ul EMPLOYEE. 8. RedenumiŃi ul EMPLOYEE2 în EMPLOYEE. 9. AdăugaŃi comentarii la definińiile celor 2 e, descriind semnificańia ului respectiv. VizualizaŃi modificările din dicńionarul de date. 10. Adăugati o constrângere de tip PRIMARY KEY la ul EMPLOYEE folosind coloana ID. Constrângerea trebuie să fie activată la creare. 11. CreaŃi o constrângere PRIMARY KEY în ul DEPARTMENT folosind coloana ID. Constrângerea trebuie să fie activată la creare. 12. AdăugaŃi o referinńă de tip cheie externă la ul EMPLOYEE care va asigura că angajańii nu sunt asignańi la un departament inexistent. 13. ConfirmaŃi constrângerile adăugate interogând ul USER_CONSTRAINTS. ObservaŃi numele şi tipul constrângerilor. CONSTRAINT_NAME C ---------------------- - DEPARTEMENT_ID_PK P EMPLOYEE_ID_PK P EMPLOYEE_DEPT_ID_FK R 14. AfişaŃi numele şi tipul obiectelor din vederea USER_OBJECTS pentru ele EMPLOYEE şi DEPARTMENT. OBJECT_NAME OBJECT_TYPE ----------------- ----------- DEPARTMENT TABLE DEPARTMENT_ID_PK INDEX EMPLOYEE TABLE EMPLOYEE_ID_PK INDEX 14