Gli esempi seguenti faranno riferimento o alla *BD1* - **Fornitori(codf, nome, età, città) -- F** - **Prodotti(codp, nome, colore) -- P** - **Forniture(codf*, codp*, prezzo, quantità) -- FP** o alla *BD2* - **Imp(matr**, nome, dip*, stip) - **Dip(cod**, nome, direttore*) ## INSERT Con riferimento alla BD1, inserisci un certo numero di tuple di fornitore: ```sql INSERT INTO F VELUES (, ... ) ``` Una tabella può essere popolata attraverso una query, ad esempio: ```sql CREATE TABLE Forn_Giovani (codf, nome, eta) INSERT INTO Forn_Giovani SELECT codf, nome, eta FROM F WHERE eta < 40 ``` Si noti che *Forn\_Giovani* è una relazione di base e non è una vista; ciò significa che le sue tuple sono fisicamente memorizzate nella BD. Nell’inserimento di tuple può verificarsi un problema di vincolo referenziale non soddisfatto; ad esempio, quando si inserisce un impiegato nella relazione *Imp* della *BD2*, deve già esistere il dipartimento di afferenza; ciò potrebbe però non essere possibile se l’impiegato è anche direttore di quel dipartimento ```sql INSERT INTO Imp VALUES (222, giada, d1) INSERT INTO Dip VALUES (d1, ricerca, 222) ``` La soluzione al problema è fornita dalle **transazioni**. ## DELETE La seguente istruzione produce la cancellazione dei fornitori di Milano. ```sql DELETE FROM F WHERE citta = Milano ``` La clausola WHERE non differisce da quella di una interrogazione SQL, come dimostrano i seguenti esempi: ```sql DELETE FROM Imp WHERE dip = (SELECT dip FROM DIP WHERE nome = ricerca) DELETE FROM F WHERE codf IN (SELECT codf FROM FP WHERE codp IN (SELECT codp FROM P WHERE colore = rosso) ``` La cancellazione di una o più tuple può comportare, come nel caso dell’inserimento, problemi di violazione del vincolo d’integrità referenziale: ```sql DELETE FROM Imp WHERE matr = 222 ``` Se *222* è la matricola dell’impiegato che è direttore del dipartimento *d1*, allora questa cancellazione lascerebbe il dipartimento d1 con un riferimento pendente. Il DBMS bloccherebbe quindi l’operazione. Il problema andrebbe preliminarmente risolto, ad esempio, cambiando il direttore del dipartimento *d1* o mettendo il suo valore a *NULL*. ## UPDATE Il seguente costrutto incrementa del 20\% lo stipendio degli impiegati dei dipartimenti di Roma: ```sql UPDATE IMP SET stip = stip*1,2 WHERE dip IN (SELECT dip FROM DIP WHERE citta = roma) ``` Anche nel caso di UPDATE potrebbero esserci problemi di integrità referenziale: ```sql UPDATE F SET codf = f2 WHERE codf = f1 ``` In questo esempio, il codice di f1 viene trasformato in f2 (assumiamo che f2 non esista nel DB). Quindi, tutte le tuple di Forniture che hanno f1 come valore della chiave secondaria codf vanno a violare il vincolo di integrità referenziale. Il DBMS è pertanto costretto a bloccare l’operazione. Anche in questo caso il problema andrebbe risolto opportunamente, in particolare, attraverso l’uso di una transazione per poter modificare contestualmente valori della chiave secondaria e della chiave primaria – infatti, non possiamo modificare prima la chiave primaria e poi la chiave secondaria (in Forniture), né fare il viceversa, perché in entrambi i casi avremmo una violazione del vincolo.