Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Inserarea, modificarea si stergerea inregistrarilor in limbajul SQL

sql



+ Font mai mare | - Font mai mic



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:

  • <nume tabela> - numele tabelului la care este adaugata inregistrarea;

(<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 

Arad

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','Ploiesti')

insert into depart values(20,'PROIECTARE','Campina')

insert into depart values(30,'SOFTWARE','Bucuresti')

insert into depart values(40,'VANZARI','Arad')

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

Erori posibile in cazul inserarii unei linii intr-un tabel

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

Erori posibile in cazul actualizarii valorilor unor atribute

Actualizarea valorilor unor atribute dintr-o linie - copil poate genera erori daca este incalcata restrictia referentiala de actualizare si nu exista valori corespondente in campul PRIMARY KEY din tabelul parinte.

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.

Actualizarea valorilor unor atribute dintr-o linie - parinte poate genera erori daca este incalcata restrictia referentiala de actualizare si nu mai exista valori corespondente in campul PRIMARY KEY din tabelul parinte pentru valorile din coloana FOREIGN KEY din tabelul copil.

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

Erori posibile in cazul stergerii unei linii dintr-un tabel

Stergerea unei linii - parinte poate genera erori daca este incalcata restrictia referentiala de stergere si mai exista valori in campul FOREIGN KEY din tabelul copil fara corespondent in coloana PRIMARY KEY din tabelul parinte. Stergerea 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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2198
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved