Sunteți pe pagina 1din 12

INCLUDEREA CONSTRNGERILOR

OBIECTIVE Dupa parcurgerea acestei lectii, ar trebuii sa stii sa faci urmatoarele: Sa descrii constrngerile Sa creezi si sa mentii constrngerile
CE SUNT CONSTRNGERILE ? Constrngerile forteaza regulile la nivel de tabela. Constrngerile previn stergerea unei tabele daca exista dependente. Urmatoarele tipuri de constrngeri sunt valide n Oracle: - NOT NULL - UNIQUE KEY - PRIMARY KEY - FOREIGN KEY - CHECK Constrngerile Serverul Oracle foloseste constrngerile ca sa previna introducerea de date invalide in tabela. Se pot folosi constrngerile n scopul: - forteaza regulile la nivel de tabela oriunde un rnd este inserat, actualizat sau sters din tabela. Constrngerea trebuie satisfacuta pentru ca operatia sa se termine cu succes. - Previne stergerea unei tabele daca exista dependente din alte tabele. - Ofera reguli pentru Oracle tools, ca de exemplu Developer/2000. Constrngere NOT NULL UNIQUE Key PRIMARY KEY FOREIGN KEY CHECK Constrngerile de integritate a datelor Descriere Specifica ca aceasta coloana nu poate contine o valoare nula. Specifica o coloana sau o combinatie de coloane a caror valoare trebuie sa fie unica pentru toate inregistrarile tabelei. Identifica unic fiecare inregistrare Stabileste si forteaza o relatie de tip cheie externa dintre coloana si o coloana din o tabela referita. Specifica o conditie care trebuie sa fie adevarata.

Ghid pentru crearea constrngerilor Constrngerile trebuie sa aiba un nume sau serverul Oracle va genera un nume utilizn formatul SYS_Cn Creaza o constrngere: - n timpul crearii tabelei - dupa ce tabela a fost creata Defineste o constrngere la nivel de coloana sau de tabela. Vizualizeaza constrngerea n dictionarul de date. Toate constrngerile sunt pastrate n dictionarul de date. Constrngerile sunt simplu de referit daca daca li se da un nume sugestiv. Constrmgerile trebuie sa urmeze regulile standard de denumire a obiectelor. Daca constrngerea nu are un nume, Oracle genereaza un nume dupa formatul SYS_Cn, unde n este un ntreg ca sa se creeze un nume unic. Constrngerile pot fi definite la crearea tabelei sau dupa ce tabela a fost creata.
1

Se pot vizualiza constrngerile create pentru o tabela daca ne uitam n dictionarul USER_CONSTRAINTS. Definirea constrngerilor CREATE TABLE [schema.] table ( column datatype [DEFAULT expr] [column_constraint], [table_constraint]); CREATE TABLE emp( empno NUMBER(4), ename VARCHAR(2), deptno NUMBER(7,2) NOT NULL, CONSTRAINT emp_empno_pk PRIMARY KEY(EMPNO)); n sintaxa avem: Schema Table DEFAULT expr Column Datatype Column_constraint table_constraint acelasi cu numele proprietarului Numele tabelei Specifica o valoare implicita daca aceasta este omisa la introducere numele coloanei tipul de data si lungimea Constrngere de integritate ca parte a definitiei coloanei Constrngere de integritate ca parte a definitiei tabelei

Constrngere la nivel de coloana column [CONSTRAINT constraint_name] constraint_type, Constrngere la nivel de tabela column , [CONSTRAINT constraint_name] constraint_type (column, ), Constrngerile sunt de obicei create n acelasi timp cu tabela. Ele pot fi adaugate si dupa crearea tabelei. Constrngerile pot fi definite la unul din urmatoarele doua nivele: Constraint level Column Table n sintaxa: constrain_name constraint_type este numele constrngerii este tipul constrngerii Descriere Refera o singura coloana si poate defini orice tip de constrngere Refera una sau mai multe coloane si este definita separat de definitiile coloanelor n tabela: poate defini orice tip de constrngere exceptnd NOT NULL

Constrngerea NOT NULL Ne asigura ca valorile null nu sunt permise pentru acea coloana. EMP EMPNO ENAME JOB COMM 7839 KING PRESIDENT 7698 BLAKE MANAGER 7782 CLARK MANAGER 7566 JONES MANAGER
Constrngere NOT NULL (nici o nregistrare nu poate contine o valoare NULL pe aceasta coloana) Absenta constrngerii NOT NULL (orice nregistrare poate contine null pentru aceasta coloana)

DEPTNO 10 30 10 20

Constrngere NOT NULL

Constrngerea NOT NULL ne asigura ca valori null nu sunt permise n coloana. Coloanele fara constrngerea NOT NULL pot contine implicit valori null. Constrngerea NOT NULL definita la nivel de coloana SQL> CREATE TABLE emp( empno NUMBER(4) ename VARCHAR2(10) NOT NULL job VARCHAR2(9) mgr NUMBER(4) hiredate DATE sal NUMBER(7,2) comm NUMBER(7,2) deptno NUMBER(7,2) NOT NULL); Constrngerea NOT NULL poate fi specificata numai la nivel de coloana. n exemplul de mai sus se aplica constrngerea NOT NULL coloanelor ENAME si DEPTNO pentru pabela EMP. Deoarece aceste constrngeri nu au nume, Oracle Server va crea nume pentru ele. Numele constrngerii poate fi specificat n timpul specificarii constrngerilor. deptno NUMBER(7,2) CONSTRAINT emp_deptno_nn NOT NULL Nota: toate constrngerile descrise n aceasta lectie pot sa nu fie prezente n exemplele de tabele furnizate mpreuna cu acest curs. Daca se doreste, ele pot fi adaugate.

Constrngerea UNIQUE Key UNIQUE key constraint DEPT DEPTNO 10 20 30 40 DNAME ACCOUNTING RESEARCH SALES OPERATIONS LOC NEW YORK DALLAS CHICAGO BOSTON Insert into 50 60 SALES DETROIT BOSTON
Not allowed ( DNAMESALES exista deja)

Allowed

O constrngere de integritate cheie unica cere ca fiecare valoare din coloana sau set de coloane trebuie sa fie unice doua nregistrari ale tabelei nu pot avea valori duplicat n coloana sau set de coloane. Coloana(setul de coloane) inclusa n definitia cheii unice se numeste cheie unica. Daca cheia unica contine mai multe coloane se numeste cheie unica compusa. Constrngerea cheie unica permite introducerea de valori null daca nu a fost definita o constrngere NOT NULL pentru acea coloana. De fapt, orice numar de nregistrari pot include valori null n coloane fara constrngerea NOT NULL deoarece valorile null sunt egale cu nimic. O valoare null n o coloana (sau n toate coloanele unei chei unice compuse) ntotdeauna satisface o constrngere de cheie unica. Nota: din cauza mecanismului de cautare pentru constrngeri unice n una sau mai multe coloane, nu pot fi valori identice n coloane not null a constrngerilor de cheie unica compusa partiala null. Constrngerea cheie unica (unique key) definita la nivel de tabela sau coloana SQL> CREATE TABLE dept( deptno NUMBER(2) dname VARCHAR(14) loc VARCHAR(13) CONSTRAINT dept_dname_uk UNIQUE(dname)); Constrngerile de cheie unica pot fi definite la nivel de coloana sau tabela. O cheie unica compusa este creata utiliznd definitia la nivel de tabela. n exemplu se aplica constrngerea de cheie unica coloanei DNAME din tabela DEPT. Numele constrngerii este DEPT_DNAME_UK. Nota: Serverul Oracle forteaza implicit constrgerea de cheie unica crend un index unic dupa cheia unica.

Constrngerea PRIMARY KEY PRIMARY KEY DEPT DEPTNO 10 20 30 40 DNAME ACCOUNTING RESEARCH SALES OPERATIONS
Insert into

LOC NEW YORK DALLAS CHICAGO BOSTON

20

MARKETING FINANCE

DALLAS NEW YORK


Not allowed (DEPTNO este NULL)

Not allowed (DEPTNO 20 deja exista)

Constrngerea de cheie primara creaza o cheie primara pentru fiecare tabela. Doar o cheie primara poate fi creata pentru fiecare tabela. Constrngerea de cheie primara este o coloana sau set de coloane care identifica unic fiecare nregistrare din tabela. Aceasta constrngere forteaza unicitatea coloanei sau a setului de coloane si asigura ca nici o coloana care este parte a cheii primare nu poate contine o valoare null. Constrngerea cheii primare definita la nivel de coloana sau tabela SQL> CREATE TABLE dept( deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13), CONSTRAINT dept_dname_uk UNIQUE (dname), CONSTRAINT dept_deptno_pk PRIMARY KEY(deptno)); Constrngerea cheie primara (PRIMARY KEY) poate fi definita la nivel de tabela sau coloana. O cheie primara compusa este creata utiliznd definitia la nivel de tabela. Exemplul defineste o cheie primara dupa coloana DEPTNO a tabelei DEPT. Numele constrngerii este DEPT_DEPTNO_PK. Nota: un index unic este automat creat pentru o coloana cheie primara.

Constrngerea FOREIGN KEY


PRIMARY KEY

DEPT DEPTNO 10 20 .

DNAME ACCOUNTING RESEARCH

LOC NEW YORK DALLAS

EMP EMPNO 7839 7698

ENAME KING BLAKE

JOB PRESIDENT MANAGER

COMM

DEPTNO 10 30

FOREIGN KEY

Insert into

7571 7571

FORD FORD

MANAGER MANAGER

200 200

9
Allowed

Not allowed (DEPTNO=9 nu exista n tabela DEPT)

Cheia externa sau constrngerea de integritate referentiala, desemneaza o coloana sau o combinatie de coloane ca cheie externa si stabileste o relatie ntre o cheie primara sau o cheie unica n aceeasi tabela sau o tabela diferita. n exemplu, DEPTNO a fost definit ca cheie externa n tabela EMP (dependenta sau tabela copil); ea refera coloana DEPTNO din tabela DEPT (referita sau tabela parinte). Valoarea unei chei externe trebuie sa se potriveasca cu o valoare existenta n tabela parinte sau sa fie NULL. Obs: Cheile externe sunt bazate pe valorile datelor si sunt pointeri pur logici, nu fizici. Constrngerea cheii externe definita la nivel de coloana sau tabela 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,
6

7 8 9 10

sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(7,2) NOT NULL, CONSTRAINT emp_detpno_fk FOREIGN KEY (deptno) REFERENCES dept (deptno));

Constrngerile cheii externe pot fi definite la nivelul constrngerilor de tabel sau de coloana. O cheie externa compusa este creata folosind definitiile tabel-nivel. Exemplul de mai sus defineste o constrngere de tip cheie externa n coloana DEPTNO din tabela EMP. Numele constrngerii este EMP_DEPTNO_FK. Cuvintele cheie ale constngerii FOREIGN KEY FOREIGN KEY Defineste coloana n tabela copil la nivelul constngerii de tabel. REFERENCES Identifica tabela si coloana n tabela parinte. ON DELETE CASCADE Permite stergeri n tabela parinte precum si stergeri de linii independente n tabela copil. Constngerile externe sunt definite n tabela copil, si tabela care contine coloana referita se afla n tabela parinte. Constrngerile externe sunt definite folosind combinatii ale cuvintelor urmatoare: FOREIGN KEY este folosit pentru a defini coloana n tabela copil la nivelul constngerii de tabel. REFERENCES identifica tabela si coloana n tabela parinte. ON DELETE CASCADE arata cnd rndul din tabela parinte este sters, rndurile independente din tabela copil fiind de asemeni sterse. Fara optiunea ON DELETE CASCADE, rndul din tabela parinte nu va putea fi sters daca este referit n tabela copil. Constrngerea CHECK Defnieste o conditie pe care fiecare rnd trebuie sa o ndeplineasca. Expresii care nu sunt permise: - Referiri la pseudocoloanele CURRVAL, NEXTVAL, LEVEL, and ROWNUM - Apeluri la functiile SYSDATE, UID, USER, and USERENV - Interogari care fac referinte la alte valori din alte rnduri. ., deptno NUMBER(2), CONSTRAINT emp_deptno_ck CHECK (DEPTNO BETWEEN 10 AND 99). Constrngerea de verificare Constrngerea de verificare defineste o conditie pe care fiecare rnd trebuie sa o ndeplinesca. Conditia poate fi folosita n aceleasi constructii ca si conditiile de interogare, cu urmatoarele exceptii: Referiri la psoudocoloanele CURRVAL, NEXTVAL, LEVEL, and ROWNUM. Apeluri la functiile SYSDATE, UID, USER, and USERENV.
7

Interogari care fac referinte la alte valori din alte rnduri. O singura coloana poate avea mai multe constrngeri de verificare care fac referiri la coloana n definitia sa. Nu exista o limita de constrngeri ce pot fi definite la o coloana. Constrngerile de verificare pot fi definite la nivel de coloana sau la nivel de tabel. Adaugnd o constrngere ALTER TABLE table ADD [ CONSTRAINT constraint] type (column); Adauga sau scoate, dar nu mofica o constrngere. Activeaza sau dezactiveaza constrngeri. Adauga o constrngere de tip NOT NULL folosind clauza MODIFY. Adaugnd o constrngere. Se poate adauga o constrngere la tabelele existente folosind declaratia ALTER TABLE mpreuna cu clauza ADD. n sintaxa: table este numele tabelei constraint este numele constrngerii type este tipul constrngerii column este numele coloanei afectate de constrngere Atentie: Denumirea constrngerii este optionala, totusi ea este recomandata. Daca nu dati nume constrngerilor, sistemul va genera el nume. Ghid: Se poate adauga, scoate, activa, dezactiva o constrngere, dar nu se poate modifica structura acesteia. Se poate adauga o constrngere de tip NOT NULL la o coloana existenta folosind clauza MODIFY din functia ALTER TABLE. Nota: Se poate defini o coloana NOT NULL doar daca tabela nu contine rnduri, deoarece nu se pot specifica datele pentru rndurile existente n acelasi timp n care adaugam noi coloane. Adaugnd o constrngere Adaugarea unei contrngeri externe la tabela EMP ne arata ca un manager trebuie sa existe ca angajat activ n tabela EMP. SQL> ALTER TABLE emp 2 ADD CONSTRAINT emp_mgr_fk 3 FOREIGN KEY(mgr) REFERENCES emp(empno); Table altered. Exemplul de mai sus creaza o contrngere de tip extern n tabela emp. Contrngerea ne asigura de existenta manager-ului ca angajat activ n tabela EMP. Scoaterea unei constrngeri Scoaterea contrngerii manager din tabela EMP. SQL>ALTER TABLE emp 2 DROP CONSTRAINT emp_mgr_fk; Table altered. Scoaterea contrngerii de tip cheie primara din tabela DEPT precum si scoaterea contrngerii externe asociate la coloana EMP.DEPTNO. SQL>ALTER TABLE dept
8

2 DROP PRIMARY KEY CASCADE; Table altered. Pentru a scoate a constrngere, trebuie identificat numele contrngerii pentru USER_CONSTRAINS si USER_CONS_COLUMNS. Apoi se foloseste functia ALTER TABLE mpreuna cu clauza DROP. Optiunea CASCADE din clauza DROP are ca efect si scoaterea tuturor constrngerilor dependente. Sintaxa: ALTER TABLE table DROP PRIMARY KEY | UNIQUE (column) | CONSTRAINT constraint [CASCADE]; table este numele tabelei column este numele coloanei afectate de contrngere constraint este numele contrngerii. Atentie: Cnd se scoate o constrngere de integritate, aceasta nu mai este folosita de catre Oracle Server si nu mai este disponibila n dictionarul de date. Dezactivarea constrngerilor Executarea clauzei DISABLE din functia ALTER TABLE pentru a dezactiva o constrngere de integritate. Aplicarea optiunii CASCADE pentru a dezactiva constrngeri de integritate dependente. SQL> ALTER TABLE emp 2 DISABLE CONSTRAINT emp_empno_pk CASCADE; Table altered. Se poate dezactiva o constrngere fara ca sa fie necesar scoaterea acesteia sau recreerea ei folosind functia ALTER TABLE mpreuna cu clauza DISABLE. Sintaxa: ALTER TABLE table DISABLE CONSTRAINT constraint [CASCADE]; Unde: table constraint Ghid: Clauza DISABLE se poate folosi att n functia CREATE TABLE ct si n functia ALTER TABLE. Clauza CASCADE dezactiveaza constrngerile de integritate dependente. Activarea constrngerilor Activarea unei constrngeri de integritate care este dezactivata folosind clauza ENABLE n definirea tabelei. SQL> ALTER TABLE emp 2 ENABLE CONSTRAINT emp_empno_pk; Table altered.
9

Unde:

este numele tabelei este numele constrngerii.

Un index de tip unic sau de tip cheie primara este automat creat daca se activeaza constrngerile UNIQUE sau PRIMARY KEY. Se poate activa o constrngere fara a o scoate sau a o recrea folosind functia ALTER TABLE mpreuna cu clauza ENABLE. Sintaxa: ALTER TABLE table ENABLE CONSTRAINT constraint; Unde: table constraint Ghid: este numele tabelei. este numele constrgerii.

Daca se activeza o constrngere, constrngerea este aplicata tuturor datelor din tabela. Toate datele din tabela trebuie sa se potriveasca cu constrngerea. Daca se activeaza o constrangere de tip unic sau cheie primara, atunci este creat n mod automat un index de tip cheie primara sau de tip unic. Clauza ENABLE se poate folosi att n functia CREATE TABLE ct si n functia ALTER TABLE. Vizualizarea constrngerilor

Interogarea tabelei USER_CONSTRAINTS pentru a putea vedea toate numele si definitiile constrngerilor. 2 3 4 SQL> SELECT constraint_name, constraint_type, search_condition FROM user_constraints WHERE table_name=EMP; CONSTRAINT_NAME SYS_C00674 SYS_C00675 EMP_EMPNO_PK C SEARCH_CONDITION C EMPNO IS NOT NULL C DEPTNO IS NOT NULL P

Dupa crearea unei tabele, se poate confirma exitenta sa prin folosirea comenzii DESCRIBE. Singura constrngere care poate fi verificata este constrngerea NOT NULL. Pentru a vedea toate constrngerile din tabela, este necesara interogarea tabelei USER_CONSTRAINTS. Exemplul de mai sus afiseaza toate constrngerile tabelei EMP. Nota: Constrngerilor care nu primesc un nume de la posesorul tabelei, li se atribuie un nume automat de catre sistem. La tipul constrngerii, C provine de la CHECK, P de la PRIMARY KEY, R de la integritate referentiala, si U de la UNIQUE. De observat faptul ca constrngerea NULL este de fapt o constrngere de tip CHECK. Vizualizarea coloanelor asociate constrngerilor Vizualizarea coloanelor USER_CONS_COLUMNS. asociate cu numele constrngerilor se face in tabela

10

SQL> SELECT constraint_name, column_name, 2 FROM user_cons_columns 3 WHERE table_name=EMP; CONSTRAINT_NAME EMP_DEPTNO_FK EMP_EMPNO_PK EMP_MGR_FK SYS_C00674 SYS_C00675 COLUMN_NAME DEPTNO EMPNO MGR EMPNO DEPTNO

Se poate vizualiza numele coloanelor implicate n constrngeri interognd dictionarul USER_CONS_COLUMNS. Aceasta vizualizare este utila mai ales n cazul contrngerilor asociate de catre sistem. Sumar

Crearea umatoarelor tipuri de constrngeri:


NOT NULL UNIQUE key PRIMARY KEY FOREIGN KEY CHECK Interogarea tabelei USER_CONSTRAINTS pentru a vizualiza toate numele si definitiile constrngerilor Probleme propuse n problemele urmatoare veti adauga constrngeri si coloane aditionale folosind functiile prezentate n aceasta lectie. Probleme 1. Adaugati o constrngere de tip PRIMARY KEY la tabela EMPLOYEE folosind coloana ID. Constrngerea trebuie sa fie activata la creare. 2. Creati o constrngere PRIMARY KEY n tabela DEPARTMENT folosind coloana ID. Constrngerea trebuie sa fie activata la creare. 3. Adaugati o referinta de tip cheie externa la tabela EMPLOYEE care se va asigura ca angajatii nu sint asignati la un departament inexistent.

4. Confirmati constrngerile adaugate interognd tabela USER_CONSTRAINTS.Observati


numele si tipul constrngerilor. Salvati textul ntr-un fisier cu numele p11q4.sql. CONSTRAINT_NAME DEPARTEMENT_ID_PK EMPLOYEE_ID_PK EMPLOYEE_DEPT_ID_FK C P P R
11

5. Afisati numele si tipul obiectelor din dictionarul USER_OBJECTS al tabelelor


EMPLOYEE si DEPARTMENT. Formatati coloanele pentru refolosirea lor. Observati ca a fost creat un nou tabel precum si un nou index. OBJECT_NAME OBJECT_TYPE DEPARTMENT TABLE DEPARTMENT_ID_PK INDEX EMPLOYEE TABLE EMPLOYEE_ID_PK INDEX 6. Modificati tabela EMPLOYEE Adaugati o coloana SALARY de tip NUMBER, precizie 7.

12

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