Laboratorul 6 CREATE DROP ALTER INSERT UPDATE DELETE
Laboratorul 6 CREATE, DROP, ALTER INSERT, UPDATE, DELETE
Crearea unui tabel • Reguli pentru numele noului tabel: – începe cu o literă – maxim 30 de caractere – conţine doar caractere din setul A-Z, a-z, 0 -9, _, #, $ – este unic în schema curentă – nu este un cuvânt rezervat
Copierea unui tabel CREATE TABLE nume_tabel [(coloana 1, coloana 2, …)] AS subquery; Exemplu: CREATE TABLE copy_emp AS (SELECT * FROM emp);
CREATE TABLE. . . Sintaxa de bază: CREATE TABLE nume_tabel (nume_coloana 1 tip_date 1 [DEFAULT expr 1] [, nume_coloana 2 tip_date 2 [DEFAULT expr 2] …])
Tipuri de date • Şiruri de caractere: – CHAR – maximum 2000 – VARCHAR 2 – maximum 4000 – CLOB – maximum 128 terabytes • Numere: – NUMBER • Date calendaristice: – DATE, TIMESTAMP • Format binar: – RAW, BLOB
Restricţii de integritate • Formulate la nivelul coloanei: – NOT NULL, cheie primară, cheie unică, cheie externă, CHECK • Formulate la nivelul tabelei (după definirea ultimei coloane): – cheie primară, cheie unică, cheie externă, CHECK
Restricţii de integritate • Reguli: – orice restricţie are asociat un nume (explicit sau implicit); – Dacă folosim CONSTRAINT atunci numele trebuie dat explicit; – Cheile multiple pot fi definite doar la nivelul tabelei; – NOT NULL doar la nivelul coloanei.
NOT NULL . . . nume_coloana tip_date NOT NULL. . . nume_coloana tip_date nume_restrictie NOT NULL. . . nume_coloana tip_date CONSTRAINT nume_restrictie NOT NULL. . .
UNIQUE. . . nume_coloana tip_date nume_restrictie UNIQUE. . . nume_coloana tip_date CONSTRAINT nume_restrictie UNIQUE. . . , CONSTRAINT nume_restrictie UNIQUE (nume_coloana 1 [, nume_coloana 1 …]). . .
PRIMARY KEY. . . nume_coloana tip_date nume_restrictie PRIMARY KEY. . . nume_coloana tip_date CONSTRAINT nume_restrictie PRIMARY KEY. . . , CONSTRAINT nume_restrictie PRIMARY KEY (nume_coloana 1 [, nume_coloana 1 …]). . .
FOREIGN KEY. . . nume_coloana 1 tip_date CONSTRAINT nume_restrictie REFERENCES nume_tabel_parinte (nume_coloana 2) [ON DELETE CASCADE|SET NULL]. . . , CONSTRAINT nume_restrictie FOREIGN KEY (nume_colana 1[, nume_coloana 2 …]) REFERENCES nume_tabel_parinte (nume_coloana 3 [, nume_coloana 4…]) [ON DELETE CASCADE|SET NULL]. . . În tabela părinte trebuie să fie definită o restricţie de tip UNIQUE sau PRIMARY KEY
CHECK. . . nume_coloana tip_date CONSTRAINT nume_restrictie CHECK (expr_logica). . . , CONSTRAINT nume_restrictie CHECK (expr_logica). . . Expresia nu poate conţine coloane din alte tabele sau următoarele elemente: SYSDATE, USER, CURRVAL, NEXTVAL, LEVEL, ROWNUM, UID, USERENV.
Modificarea restricţiilor ALTER TABLE nume_tabel ADD CONSTRAINT nume_restrictie tip_restrictie (coalana); ALTER TABLE nume_tabel MODIFY (nume_coalana CONSTRAINT nume_restrictie NOT NULL); ALTER TABLE nume_tabel DROP CONSTRAINT nume_restrictie [CASCADE]; ALTER TABLE nume_tabel DISABLE|ENABLE CONSTRAINT nume_restrictie [CASCADE];
ALTER TABLE • adăugare: ALTER TABLE nume_tabel ADD (nume_coloana 1 tip_date 1 [DEFAUL expr 1] [, nume_coloana 2 tip_date 2 [DEFAUL expr 2] …]) • modificare: ALTER TABLE nume_tabel MODIFY (nume_coloana 1 tip_date 1 [DEFAUL expr 1] [, nume_coloana 2 tip_date 2 [DEFAUL expr 2] …]) – schimbarea tipului de date sau micşorarea dimensiunii este posibilă doar dacă nu sunt valori pe coloana respectivă sau dacă nu sunt înregistrări.
ALTER TABLE • ştergere: ALTER TABLE nume_tabel DROP COLUMN nume_coloana; – doar câte o singură coloană; – datele nu pot fi recuperate; – nu pot fi şterse toate coloanele unui tabel; – poate fi costisitoare. ALTER TABLE nume_tabel SET UNUSED (nume_coloana); ALTER TABLE nume_tabel DROP UNUSED COLUMNS;
DROP TABLE nume_tabel; – poate fi reversibilă; FLASHBACK TABLE nume_tabel TO BEFORE DROP; SELECT original_name, droptime FROM user_recyclebin;
RENAME, TRUNCATE RENAME nume_tabel TO nume_nou; TRUNCATE TABLE nume_tabel; – şterge toate întregistrările; – nu este reversibilă (spre deosebire de DELETE).
Comanda INSERT - sintaxa INSERT INTO nume_tabel [(coloana 1, coloana 2, …)] VALUES (expresie 1, expresie 2, …) INSERT INTO nume_tabel [(coloana 1, coloana 2, …)] SELECT …
Comanda INSERT Nume empno Tip number(4) char(10) char(9) number(4) date NOT NULL ename job mgr hiredate sal comm deptno number(7, 2) number(2) X INSERT INTO copy_emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7788, ’Bill Gates’, ’Doorman’, 7839, ’ 13 -JAN 1986’, 450, 10, 30) - în lista de valori poate fi filosit NULL pentru coloanele ce permit acest lucru
Comanda INSERT Nume empno Tip NOT NULL ename job mgr hiredate sal number(4) char(10) char(9) number(4) date comm deptno number(7, 2) number(2) X INSERT INTO copy_emp (empno, ename, job, sal, deptno) VALUES (7788, ’Bill Gates’, ’Doorman’, 450, 30) - nu pot lipsi colane ce nu permit NULL pentru că acestea primesc inplicit valoarea NULL
Comanda INSERT Nume empno Tip NOT NULL ename job mgr hiredate sal number(4) char(10) char(9) number(4) date comm deptno number(7, 2) number(2) X INSERT INTO copy_emp VALUES (7788, ’Bill Gates’, ’Doorman’, 7839, ’ 13/7/1986’, 450, 10, 30)
Comanda INSERT Nume empno Tip NOT NULL ename job mgr hiredate sal number(4) char(10) char(9) number(4) date comm deptno number(7, 2) number(2) X INSERT INTO copy_emp VALUES (7788, ’Bill Gates’, ’Doorman’, 450, 30) ORA-00947: not enough values
Comanda INSERT Nume empno Tip NOT NULL ename job mgr hiredate sal number(4) char(10) char(9) number(4) date comm deptno number(7, 2) number(2) X INSERT INTO copy_emp (empno, ename, job, hiredate, sal, comm) VALUES (7788, ’Bill Gates’, ’Doorman’, SYSDATE, 450*0. 1) - clauza VALUES poate conţine valori speciale, expresii sau funcţii
Comanda INSERT INTO copy_emp (empno, ename, job, hiredate, sal, comm) SELECT empno+1, ename, NULL, 0, comm*2 FROM emp WHERE deptno=20 - lista de coloane a comenzii INSERT poate lipsi dacă subinterogarea returnează aceleaşi coloane(ca număr, tip de date şi ordine) cu cele dint tabela destinaţie
Comanda UPDATE nume_tabel SET coloana 1 = expresie 1 [, coloana 2 = expresie 2 …] [WHERE conditie] - expresiei poate fi o subinterogare ce returneaza o singura valoare (o singura coloana si o singura inregistrare), si apare intre paranteze
Comanda UPDATE nume_tabel SET (coloana 1, coloana 2) = (SELECT expresie 1, expresie 2 FROM …) [WHERE conditie] - subinterogare returneaza câte o singura înregistrare pentru fiecare înregistrare ce trebuie actualizată în tabela destinaţie
Comanda DELETE [FROM] nume_tabel [WHERE conditie]
Flashback Query • sistemul păstrează informaţii despre modificările făcute asupra datelor (valorile vechi pentru UPDATE, respectiv toată înregistrarea pentru DELETE) pentru aprox. 15 min. SELECT versions_starttime, versions_endttime, . . . FROM nume_tabel VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
- Slides: 28