Col termine "popolazione del database" si intende l'attività di inserimento dei dati al suo interno. In un database relazionale cio' corrisponde alla creazione delle righe che compongono le tabelle che costituiscono il database. Normalmente la memorizzazione di una singola informazione corrisponde all'inserimento di una o piu' righe in una o piu' tabelle del database. Si prenda, ad esempio, la seguente informazione bibliografica:
M. Agosti, L. Benfante, M. Melucci. OFAHIR: "On-the-Fly" Automatic Authoring of Hypertexts for Information Retrieval. In S. Spaccapietra, F. Maryansky (Eds), Searching for Semantics: Data Mining, Reverse Engineering. Proc. of the 7th IFIP 2.6 Working Conference on Database Semantics (DS-7), Leysin, Switzerland, October 1997, 129-154.
Supponendo che nel database non sia gia' presente nessuna delle informazioni che la riguardano (come ad esempio qualcuno degli autori o gli atti del congresso a cui si riferisce), il suo inserimento nel nostro database d'esempio corrisponde all'inserimento delle seguenti righe:
- cinque righe nella tabella Person corrispondendi a ciascuno degli autori e dei curatori;
- una riga nella tabella Institution;
- due righe nella tabella Publication: una per gli atti del congresso e una per l'articolo contenuto in quegli atti;
- una riga nella tabella Proceedings;
- una riga nella tabella InProceedings;
- tre righe nella tabella Author, una per ciascun autore della pubblicazione;
- due righe nella tabella Editor, una per ciascun curatore della pubblicazione.
L'ordine delle precedenti operazioni non è puramente casuale, infatti l'inserimento delle righe deve essere fatto in modo da rispettare i vincoli imposti sulle tabelle. Ad esempio, dato che non potrà esistere una chiave esterna senza che sia stata prima inserita la riga a cui essa si riferisce, prima di poter inserire una riga nella tabella InProceedings
dovrà essere stata inserita la corrispondente riga nella tabella Proceedings
.
Se accade che un vincolo viene violato, il DBMS impedisce l'operazione di inserimento facendola fallire. Si veda la lezione precedente (Creare il database) per la descrizione dei vincoli che possono essere imposti su una tabella e sulle sue colonne.
INSERT, inserire una riga in una tabella
L'istruzione SQL che effettua l'inserimento di una nuova riga in una tabella è INSERT. La sintassi con cui essa viene usata piu' comunemente è:
INSERT INTO nome_tabella [ ( elenco_campi ) ]
VALUES ( elenco_valori )
nome_tabella
è il nome della tabella in cui deve essere inserita la nuova riga;elenco_campi
è l'elenco dei nomi dei campi a cui deve essere assegnato un
valore, separati fra loro da una virgola. I campi non compresi nell'elenco assumeranno il loro valore di default o NULL se non hanno un valore di default. È un errore non inserire nell'elenco un campo che non abbia un valore di default e non possa assumere il valoreNULL
. Se l'elenco non viene specificato dovranno essere specificati i valori di tutti i campi della tabella.elenco_valori
è l'elenco dei valori che saranno assegnati ai campi della tabella, nell'ordine e numero specificati dall'elenco_campi
o in quello della definizione della tabella (seelenco_campi
non viene specificato). I valori possono essere un'espressione scalare del tipo appropriato per il campo o le keywordDEFAULT
oNULL
, se il campo prevede un valore di default o ammette il valoreNULL
.
Il precedente esempio di inserimento viene quindi eseguito tramite le seguenti istruzioni SQL:
INSERT INTO Person VALUES ( 1, 'Agosti', 'Maristella' );
INSERT INTO Person VALUES ( 2, 'Benfante', 'Lucio' );
INSERT INTO Person VALUES ( 3, 'Melucci', 'Massimo' );
INSERT INTO Person VALUES ( 4, 'Spaccapietra', 'S.' );
INSERT INTO Person VALUES ( 5, 'Maryansky', 'F.' );
INSERT INTO Institution ( ID, name, city, country )
VALUES ( 1, '7th IFIP 2.6 Working Conference on Database Semantics (DS-7)',
'Leysin', 'Switzerland' );
INSERT INTO Publication VALUES ( 1, 'Proceedings' );
INSERT INTO Publication VALUES ( 2, 'InProceedings' );
INSERT INTO Proceedings ( ID, title, organization, pub_month, pub_year )
VALUES ( 1, 'Searching for Semantics: Data Mining, Reverse Engineering',
1, 'Oct', 1997 );
INSERT INTO InProceedings ( ID, proceedingsID, title, pages )
VALUES ( 2, 1,
'OFAHIR: "On-the-Fly" Automatic Authoring of Hypertexts for Information Retrieval',
'129-154' );
INSERT INTO Author VALUES ( 2, 1 );
INSERT INTO Author VALUES ( 2, 2 );
INSERT INTO Author VALUES ( 2, 3 );
INSERT INTO Editor VALUES ( 1, 4 );
INSERT INTO Editor VALUES ( 1, 5 );
Un'altra forma abbastanza utilizzata dell'istruzione INSERT segue la seguente sintassi:
INSERT INTO nome_tabella [ ( elenco_campi ) ]
istruzione_select
L'unica differenza con la precedente sintassi consiste nella sostituzione della clausola VALUES con un istruzione SELECT
. L'istruzione SELECT sarà esaminata in dettaglio nella successiva lezione (Interrogare il database). Per il momento ci basti sapere che SELECT permette di estrarre dalle tabelle del database dei dati che vengono organizzati in una nuova relazione.
La precedente istruzione INSERT permette quindi di inserire nella tabella e nei campi specificati dati provenienti da altre tabelle. Ovviamente, affinché l'istruzione venga eseguita con successo, i dati prodotti dall'istruzione SELECT
dovranno essere compatibili con i vincoli ed i domini dei campi della tabella in cui si sta effettuando l'inserimento.
Nel file popolate_biblio.sql sono presenti le istruzioni SQL che popolano il
database bibliografico con i dati che verranno utilizzati negli esempi delle
successive lezioni.