CATEGORII DOCUMENTE |
Inserarea, modificarea si stergerea inregistrarilor in limbajul SQL
Inserarea liniilor intr-un tabel
Sintaxa comenzii de inserare a unei linii intr-un tabel este urmatoarea:
INSERT INTO <nume tabela> [(<camp_1>[, <camp_2>, .,
<camp_n>])] VALUES (<val_1>[, <val_2>, ., <val_n>])
Argumentele folosite sunt:
(<camp_1>[, <camp_2>, ., <camp_n>]), respectiv (<val_1>[, <val_2>, ., <val_n>]) - se vor introduce valorile: val_1, val_2, ., val_n in campurile: camp_1, camp_2, ., camp_n.
Observatii:
Lista de campuri este optionala. Daca lipseste, trebuie sa existe compatibilitate de tip, numar si ordine intre lista de valori si lista de campuri corespondente din tabel;
Se poate schimba ordinea introducerii valorilor in tabel numai daca se modifica si ordinea in lista de campuri.
Introducerea datelor in tabele intre care exista o relatie parinte - copil trebuie sa se faca respectand restrictiile referentiale de inserare: nu se pot insera date intr-un tabel copil, daca in tabelul parinte nu exista valori corespondente pentru coloana comuna. Astfel, in programe, se introduc mai intai date in tabelul parinte.
Exemplu Fie baza de date FIRMA cu tabelele: DEPART (departamente), ANG (angajati), SALGRD (grade salarii). Sa se insereze urmatoarele date in tabele:
Tabelul ,depart.dbf'.
Nrdepart |
Numedepart |
Loc |
CONTABILITATE |
Ploiesti |
|
PROIECTARE |
Campina |
|
SOFTWARE |
Bucuresti |
|
VANZARI |
|
Tabelul 'ang.dbf'.
Codang |
Nume |
Functie |
Manager |
Datan |
Salariu |
Comision |
Nrdepart |
Petre |
PRESEDINTE |
.NULL. |
.NULL | ||||
Toma |
MANAGER |
NULL | |||||
Badea |
MANAGER |
NULL | |||||
Dinu |
PROGRAMATOR |
NULL | |||||
Tache |
PROIECTANT |
NULL | |||||
Florea |
PROIECTANT |
NULL | |||||
Popa |
VANZATOR |
Tabelul 'salgrd.dbf'.
Grad |
Salmin |
Salmax |
1900.00 |
||
2200.00 |
||
2600.00 |
||
3000.00 |
||
4000.00 |
Programul care insereaza aceste date in tabelele bazei de date FIRMA este urmatorul:
close all
clear
open database firma.dbc
insert into depart values(10,'CONTABILITATE','
insert into depart values(20,'PROIECTARE','Campina')
insert into depart values(30,'SOFTWARE','Bucuresti')
insert into depart
values(40,'VANZARI','
select * from depart
insert into ang values(7839, 'Petre', 'PRESEDINTE', null, ;
,3800,null,10)
insert into ang values(7698, 'Toma', 'MANAGER', 7839, ;
, 2600, null, 40)
insert into ang values(7762,'Badea','MANAGER', 7839, ;
, 1900, null, 10)
insert into ang values(7562, 'Dinu', 'PROGRAMATOR', 7762, ;
, 2100, null, 30)
insert into ang values(7329, 'Tache', 'PROIECTANT', 7762, ;
, 2300, null, 20)
insert into ang values(7446, 'Florea', 'PROIECTANT', 7698, ;
, 1960, null, 40)
insert into ang values(7586, 'Popa', 'VANZATOR', 7698,;
, 1770, 1200, 40)
select * from ang
insert into salgrd values(1, 1600, 1900)
insert into salgrd values(2, 1901, 2200)
insert into salgrd values(3, 2201, 2600)
insert into salgrd values(4, 2601, 3000)
insert into salgrd values(5, 3001, 4000)
select * from salgrd
close databases
Introducerea unei linii intr-un tabel copil poate
genera erori daca este incalcata restrictia referentiala de inserare si nu exista
valori corespondente in coloana PRIMARY KEY din tabelul parinte. Inserarea de linii - parinte se poate efectua intotdeauna.
Exemplu : La executia comenzii
INSERT INTO ang VALUES(7522, 'Kioko', 'TEHNICIAN', 7698,;
este generata eroare (figura 1) deoarece in tabelul 'depart.dbf' nu exista departamentul 60:
Exemple
Cititi numarul departamentului, numele departamentului, localitatea si adaugati aceste date la tabelul DEPART :
Versiunea SQL - Visual FoxPro:
CLOSE ALL
@ 10,10 SAY 'nrdepart'
@ 10,20 GET a DEFAULT 0
@ 12,10 SAY 'numedepart:'
@ 12,20 GET b DEFAULT SPACE (14)
@ 14,10 SAY 'loc:'
@ 14,20 GET c DEFAULT SPACE (13)
read
OPEN DATABASE firma EXCLUSIVE
USE depart
INSERT INTO depart VALUES (a, UPPER(b),;
ALLTRIM (PROPER (c)))
SELECT * FROM depart
CLOSE DATABASES
Versiunea clasica de program Visual FoxPro care adauga linii intr-un tabel folosind comenzile append blank si replace genereaza eroare datorita restrictiei CHECK (figura 2):
Se citeste de la tastatura in mod repetat o variabila a (codul unui angajat). Cautati persoana cu codul a in tabelul ang.dbf (baza de date FIRMA); daca nu exista, inserati in tabela toate informatiile despre persoana respectiva (se citesc numele, functia, manager, data nasterii, salariul, comisionul si numarul departamentului unde lucreaza). Daca exista, afisati salariul. Citirea se opreste in momentul cand introduceti "n" ca raspuns la intrebarea "Mai introduceti date?". Sa se scrie o functie de validare pentru asigurarea respectarii restrictiilor referentiale.
CLOSE ALL
r='d'
DO WHILE UPPER(r)<>'N'
CLEAR
CLEAR ALL
OPEN DATABASE firma.dbc EXCLUSIVE
USE ang.dbf
@10,10 SAY 'introduceti codul angajatului'
@10,40 GET a DEFAULT 0 PICTURE '9999'
READ
LOCATE FOR a = codang
IF FOUND()
@12,10 SAY 'angajatul cu acest cod este'
@12,40 SAY nume
@12,60 SAY 'si are salariul:'
@12,75 SAY salariu
ELSE
@12,10 SAY 'introduceti datele pentru noul angajat:'
@13,10 SAY 'nume: '
@13,20 GET b DEFAULT SPACE (12)
@14,10 SAY 'functie: '
@14,20 GET c DEFAULT SPACE (16)
@15,10 SAY 'manager: '
@15,20 GET d DEFAULT 0
@16,10 SAY 'data nasterii: '
@16,20 GET e DEFAULT
@17,10 SAY 'salariul: '
@17,18 GET f DEFAULT 0 PICTURE '99999999'
@18,10 SAY 'comision: '
@18,22 GET g DEFAULT 0
@19,10 SAY 'numarul departamentului: '
@19,40 GET h DEFAULT 0 PICTURE REPLICATE('9',2)
READ VALID exista_departament(h)
clear
INSERT INTO ang (codang,nume,functie,manager,;
datan,salariu, comision, nrdepart);
VALUES (a,proper(alltrim(b)),upper(alltrim(c)),d,e,f,g,h)
BROWSE
ENDIF
@22,10 SAY 'mai introduceti date'
@22,30 GET r default space (1)
READ
CLOSE ALL
ENDDO
FUNCTION exista_departament && functie de validare
PARAMETER h
OPEN DATABASE firma
USE depart
sw=.F.
SCAN
IF nrdepart=h
sw=.T.
ENDIF
ENDSCAN
IF NOT sw
@20,10 SAY 'Numarul departamentului trebuie sa fie dintre cele'
@21,10 SAY ' existente in tabelul DEPART.DBF'
ENDIF
CLOSE ALL
RETURN sw
Observatie: Functia exista_departament() asigura respectarea restrictiei referentiale la inserare, verificand daca numarul departamentului citit (parametrul h) exista in tabelul ,depart.dbf'.
Modificarea inregistrarilor unui tabel
Comanda SQL - UPDATE permite modificarea valorilor unor atribute pentru inregistrarile selectate in clauza WHERE. Sintaxa comenzii este:
UPDATE [baza_de_date!]tabel
SET coloana_1 = expresie1[, coloana_2 = expresie2 ]
WHERE exprL1 [AND | OR expL2 ]]
Observatii: Comanda UPDATE - SQL utilizeaza blocarea inregistrarilor pentru un tabel deschis in retea. Se recomanda deschiderea tabelului in mod exclusiv sau blocarea cu functia FLOCK( ).
Exemple: Pentru baza de date Firma.dbc sa se realizeze urmatoarele actualizari:
Modificati in tabela ,depart.dbf' localitatea departamentului 40 in Ploiesti :
UPDATE depart SET loc='Ploiesti' WHERE nrdepart=40
Modificati in tabela 'ang.dbf' comisionul pentru toti angajatii din departamentul 40 la valoarea 1500:
UPDATE ang SET comision=1500 WHERE nrdepart=40
Modificati tabelul ,salgrd.dbf' astfel incat salariul maxim de la categoria de salarizare 5 sa fie 7000:
UPDATE salgrd SET salmax=7000 WHERE grad=5
Exemplu : La executia comenzii
UPDATE ang SET nrdepart=45 WHERE nrdepart=40
este generata eroarea Trigger Failed deoarece in tabelul parinte 'depart.dbf' nu exista departamentul 45.
Exemplu : La executia comenzii
UPDATE depart SET nrdepart=15 WHERE nrdepart=10
este generata eroarea Trigger Failed deoarece in tabelul copil 'ang.dbf' mai exista linii cu departamentul 10 care raman fara corespondent in tabelul parinte 'depart.dbf'.
Stergerea liniilor unui tabel
Comanda SQL - DELETE marcheaza pentru stergere inregistrarile selectate in domeniul specificat prin clauza WHERE (stergere logica). Sintaxa comenzii este :
DELETE FROM [baza_de_date!]tabel
[WHERE exprL1 [AND | OR expL2 ] ]
Observatii:
Inregistrarile marcate pentru stergere nu sunt sterse fizic din tabel pana la folosirea comenzii PACK (stergere fizica).
Marcajul pentru stergere poate fi anulat cu RECALL.
Pentru utilizarea comenzii SQL - DELETE este necesara deschiderea bazei de date in mod exclusiv.
Exemple: Pentru baza de date Firma.dbc sa se realizeze urmatoarele stergeri:
Stergeti din tabela ,ang.dbf' salariatul cu numele Dinescu:
OPEN DATABASE firma.dbc EXCLUSIVE
DELETE FROM ang WHERE nume='dinescu'
BROWSE FIELDS nume, functie, nrdepart
PACK
BROWSE FIELDS nume, functie, nrdepart
CLOSE ALL
Marcati pentru stergere angajatii cu salariul <= 2000. Sa se afiseze persoanele marcate pentru stergere si numarul lor, apoi sa se anuleze marcajul.
CLOSE DATABASES
CLEAR
OPEN DATABASE firma exclusive
DELETE FROM ang WHERE salariu <= 2000
LIST FIELDS nume, salariu FOR DELETED( )
COUNT FOR DELETED( )=.T. TO n
?'Au fost marcate pentru stergere ', n, ' persoane'
RECALL ALL && anuleaza toate marcajele pentru stergere
CLOSE ALL && se inchid toate fisierele
tergerea de
linii - copil se poate efectua intotdeauna.
Exemplu : La executia comenzii
delete from depart where nrdepart=10
este generata eroarea Trigger Failed deoarece in tabelul 'ang.dbf' mai exista inregistrari cu departamentul 10.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2340
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved