Laboratorio di Sistemi Informativi

Transcript

Laboratorio di Sistemi Informativi
Laboratorio di Sistemi Informativi
Corso di Laurea in Informatica - A. A. 2006-2007
Modifica degli schemi
Inserimento, cancellazione e modifica dei dati
Donatella Merlini
Dipartimento di Sistemi e Informatica
viale Morgagni 65, 50134, Firenze
[email protected]
http://www.dsi.unifi.it/∼merlini/
Laboratorio di Sistemi Informativi – p. 1/30
Modifica struttura tabelle
Talvolta occorre modificare la struttura di una tabella perché
ci rendiamo conto che non soddisfa i requisiti richiesti. Il
comando adatto è ALTER TABLE. Ecco alcuni esempi:
ALTER TABLE NomeTb DROP PRIMARY KEY: elimina
l’indicazione della chiave primaria.
ALTER TABLE NomeTb ADD PRIMARY
KEY(NomeCol, ....): aggiunge una chiave primaria.
ALTER TABLE NomeTb DROP NomeCol: elimina una
colonna.
Laboratorio di Sistemi Informativi – p. 2/30
ALTER TABLE NomeTb CHANGE VecchioNomeCol
NuovoNomeCol NuovoTipo: cambia nome e tipo di
una colonna.
ALTER TABLE NomeTb ADD NomeCol Tipo:
aggiunge un nuovo campo alla tabella.
ALTER TABLE NomeTb RENAME NuovoNomeTb:
cambia nome a una tabella.
Laboratorio di Sistemi Informativi – p. 3/30
Aggiungere una nuova colonna nella tabella Clienti che
tenga conto del tipo di cliente (R=cliente regolare,
D=distributore, S=cliente speciale)
ALTER TABLE Clienti
ADD TipoCliente CHAR(1);
MySQL assegna valore NULL a tutte le righe già esistenti.
Laboratorio di Sistemi Informativi – p. 4/30
Aumentare a 20 caratteri la lunghezza della colonna
VIA nella tabella Clienti
ALTER TABLE Clienti
MODIFY Via CHAR(20);
Modificare la colonna CITTA della tabella Clienti in
modo che non siano consentiti NULL.
ALTER TABLE Clienti
MODIFY Citta CHAR(15) NOT NULL;
Laboratorio di Sistemi Informativi – p. 5/30
Rimozione di componenti
Mentre il comando ALTER TABLE effettua modifiche sullo
schema delle tabelle, il comando DROP permette di
eliminare componenti:
Possiamo cancellare un’intera base di dati, compreso
tutto il suo contenuto, con il comando:
DROP DATABASE [IF EXISTS] NomeDb;
Per cancellare una o piú tabelle:
DROP TABLE [IF EXISTS] NomeTb
[, NomeTb, ....];
Laboratorio di Sistemi Informativi – p. 6/30
Inserimento di righe
Il comando INSERT si usa per inserire righe in una tabella.
La sintassi è la seguente:
INSERT INTO NomeTb [(ListaAttributi)]
VALUES(ListaValori);
Volendo inserire una riga nella tabella Rappresentanti:
INSERT INTO Rappresentanti
VALUES(’03’,’Jones’,’Mary’,’123 Main’,
’Grant’,’MI’,’49219’,215,5);
Si osservi che le stringhe di caratteri (’03’,’Jones’, e
così via ), sono racchiuse fra virgolette semplici, perché
sono valori per colonne di tipo CHAR.
Laboratorio di Sistemi Informativi – p. 7/30
L’ordinamento degli attributi (se presente) e dei valori è
significativo.
Le due liste devono avere lo stesso numero di elementi.
Se la lista di attributi è omessa, si fa riferimento a tutti
gli attributi della relazione, secondo l’ordine con cui
sono stati definiti.
Se la lista di attributi non contiene tutti gli attributi della
relazione, per gli altri viene inserito un valore nullo (che
deve essere permesso) o un valore di default.
INSERT INTO Rappresentanti(CodR,cognome,nome)
VALUES(’18’,’Paperino’,’Paolino’);
Laboratorio di Sistemi Informativi – p. 8/30
Il comando INSERT può essere utilizzato anche con le
seguenti forme sintattiche:
Si possono estrarre i dati da una o più tabelle della
base di dati e inserirli nella nuova tabella con il
comando SELECT (che approfondiremo più avanti):
INSERT INTO NomeTb [(ListaAttributi)]
SELECT ....
Supponendo di aver creato una tabella PiccoliClienti
con le stesse caratteristiche di Clienti:
INSERT INTO PiccoliClienti
SELECT *
FROM Clienti
WHERE Fido<=1200;
Laboratorio di Sistemi Informativi – p. 9/30
Si possono specificare le colonne in cui inserire i dati
anche nel modo seguente (si introduce una riga alla
volta ma non siamo obbligati ad inserire i valori per tutte
le colonne):
INSERT INTO NomeTb
SET NomeCol=(espr|DEFAULT), ....
INSERT INTO Rappresentanti
SET Cognome=’Rossi’;
Laboratorio di Sistemi Informativi – p. 10/30
Cancellazione di righe
Il comando DELETE si usa per cancellare righe da una
tabella. La sintassi è la seguente:
DELETE FROM NomeTb
[WHERE Condizione]
[ORDER BY Condizione]
[LIMIT Righe]
Elimina le tuple che soddisfano la condizione.
Può causare (se i vincoli di integrità referenziale sono
definiti con politiche di reazione CASCADE) la
cancellazione di tuple da altre relazioni.
Se la clausola WHERE viene omessa, si intende WHERE
TRUE.
Laboratorio di Sistemi Informativi – p. 11/30
L’opzione ORDER BY specifica l’ordine in cui eliminare
le righe. È utile unito all’opzione LIMIT che permette di
indicare il numero massimo di righe da cancellare.
Laboratorio di Sistemi Informativi – p. 12/30
Eliminazione delle righe nelle quali il numero del
rappresentante è 18:
DELETE FROM Rappresentanti
WHERE CodR=’18’;
Eliminazione di tutte le righe:
DELETE FROM Rappresentanti;
Laboratorio di Sistemi Informativi – p. 13/30
Aggiornamento dei dati
Il comando UPDATE si usa per aggiornare una tabella. La
sintassi è la seguente:
UPDATE NomeTb
SET NomeCol1 =espr1 [,NomeCol2 =espr2 ,...]
[WHERE Condizione]
[ORDER BY Condizione]
[LIMIT Righe]
Laboratorio di Sistemi Informativi – p. 14/30
Modifica delle righe il cui numero di rappresentante è
18:
UPDATE Rappresentanti
SET cognome=’Marlin’
WHERE CodR=’18’;
Modifica dei prezzi degli articoli:
UPDATE Articoli
SET PrzUnitario=PrzUnitario*1.1;
Laboratorio di Sistemi Informativi – p. 15/30
Modifica in NULL dell’indirizzo del cliente numero 124:
UPDATE Clienti
SET Via=NULL
WHERE CodC=’124’;
Creare la stessa voce in tutte le righe:
UPDATE Clienti
SET TipoCliente=’R’;
Modificare in S il tipo del cliente numero 412:
UPDATE Clienti
SET TipoCliente=’S’
WHERE CodC=’412’;
Laboratorio di Sistemi Informativi – p. 16/30
Importazione di dati
Inserire i dati utilizzando i comandi INSERT INTO
.... VALUES è poco pratico.
Il comando LOAD DATA INFILE permette di inserire
grandi quantità di dati in una tabella direttamente da un
file di testo.
Nel formato standard, ciascuna riga di una tabella deve
essere scritta in una linea diversa del file e i valori delle
colonne devono essere separati da un carattere di
tabulazione.
Il formato del file è comunque configurabile.
Laboratorio di Sistemi Informativi – p. 17/30
Dipartimento.txt
42
128
NULL
NULL
Finanza
Ricerca e Sviluppo
Risorse Umane
Vendite
LOAD DATA INFILE ’Dipartimento.txt’
INTO TABLE Dipartimento;
Laboratorio di Sistemi Informativi – p. 18/30
La sintassi generale del comando LOAD DATA INFILE è
la seguente:
LOAD DATA [LOCAL] INFILE ’NomeFile’
INTO TABLE NomeTb
[FIELDS
[TERMINATED By ’string’]
[[OPTIONALLY] ENCLOSED BY ’char’]
[Escaped BY ’char’] ]
[ LINES
[TERMINATED BY ’string’]
[STARTING BY ’string’] ]
[IGNORE n LINES]
[(NomeCol,· · ·)];
Laboratorio di Sistemi Informativi – p. 19/30
La parola chiave LOCAL indica che il file si trova sulla
stessa macchina del client. Se questo non è
specificato, MySQL cerca il file sul server.
Le opzioni FIELDS e LINES indicano come sono
strutturati i dati nel file.
L’opzione IGNORE n LINES dice a MySQL di ignorare
le prime n linee del file (ad esempio per ignorare
l’intestazione del file).
L’istruzione finale permette di specificare che si vuole
leggere soltanto i dati di alcune colonne della tabella.
Laboratorio di Sistemi Informativi – p. 20/30
Se non viene specificata la clausola FIELDS è come se
si si scrivesse:
FIELDS TERMINATED BY ’\t’
ENCLOSED BY ’’ ESCAPED BY ’\\’
Se non viene specificata la clausola LINES è come se
si scrivesse:
LINES TERMINATED BY ’\n’ STARTING BY ’’
Laboratorio di Sistemi Informativi – p. 21/30
In altre parole, per default, LOAD DATA INFILE agisce nel
modo seguente quando legge un file:
Fa corrispondere ogni linea del file ad una riga della
tabella.
Non salta alcun prefisso delle linee del file.
Divide le linee in campi in corrispondenza di caratteri di
tabulazione.
Non si aspetta che i campi siano racchiusi tra nessun
tipo di carattere.
Interpreta le occorrenze di tab, newline, o ’\’ preceduti
da ’\’ come caratteri escape.
Laboratorio di Sistemi Informativi – p. 22/30
Un formato abbastanza comune è il CSV o a valori separati
da virgola. Molti programmi sono in grado di leggere e
scrivere file di questo tipo, ad esempio Excel.
Persone.csv
Nome,Cognome,Città
Paolo,Rossi,Firenze
Maria,Verdi,Roma
Marco,Bianchi,Milano
LOAD DATA INFILE ’Persone.csv’
INTO TABLE Persone
FIELDS TERMINATED BY ’,’
IGNORE 2 LINES
(Nome, Cognome, Citta);
Laboratorio di Sistemi Informativi – p. 23/30
Esportazione di dati
Per esportare i dati contenuti in una tabella si usa il
comando SELECT (sul quale torneremo in modo
approfondito):
SELECT * INTO OUTFILE ’NomeFile’
FROM NomeTb;
Sono possibili anche le opzioni FIELDS
TERMINATED/ENCLOSED come per LOAD DATA INFILE.
SELECT * INTO OUTFILE ’DatiClienti.txt’
FROM Clienti;
SELECT * INTO OUTFILE ’DatiClienti.txt’
LINES TERMINATED BY ’\n’ FROM Clienti;
Il file NomeFile viene creato all’interno della cartella che
contiene la base di dati.
Laboratorio di Sistemi Informativi – p. 24/30
Per default, SELECT * INTO OUTFILE agisce nel modo
seguente quando scrive un file:
Scrive i campi separandoli da caratteri di tabulazione.
Non racchiude i campi tra nessun tipo di carattere.
Usa ’\’ per rappresentare caratteri tab, newline e ’\’.
Scrive caratteri di accapo in corrispondenza della fine di
ogni riga.
Laboratorio di Sistemi Informativi – p. 25/30
Script per il popolamento di agenti, auto
insert into
values
insert into
values
insert into
values
agenti
(567,’RSSM’,’Rossi’,’Mario’);
agenti
(456,’NREL’,’Neri’,’Luigi’);
agenti
(638,’NREP’,’Neri’,’Piero’);
insert into auto
values(’FI’,’2F7643’,’Verdi Piero’,’Via Tigli’);
insert into auto
values(’FI’,’1A2396’,’Verdi Piero’,’Via Tigli’);
insert into auto
values(’FI’,’4E5432’,’Bini Luca’,’Via Aceri’);
insert into auto
values(’MI’,’2F7643’,’Bianchi Gino’,’Via Aceri’);
Laboratorio di Sistemi Informativi – p. 26/30
.... e infrazioni
insert into infrazioni(data,agente,articolo,prov,numero)
values(’2005-10-25’,567,44,’FI’,’4E5432’);
insert into infrazioni(data,agente,articolo,prov,numero)
values(’2005-10-26’,456,34,’FI’,’4E5432’);
insert into infrazioni(data,agente,articolo,prov,numero)
values(’2005-10-26’,456,34,’FI’,’2F7643’);
insert into infrazioni(data,agente,articolo,prov,numero)
values(’2005-10-15’,456,53,’MI’,’2F7643’);
insert into infrazioni(data,agente,articolo,prov,numero)
values(’2005-10-12’,567,44,’MI’,’2F7643’);
Laboratorio di Sistemi Informativi – p. 27/30
Importazione dati agenti
Supponendo di avere i dati degli agenti memorizzati nel file
DatiAgenti.in:
567,RSSM,Rossi,Mario
456,NREL,Neri,Luigi
638,NREP,Neri,Piero
possiamo popolare la tabella agenti anche nel modo
seguente:
LOAD DATA INFILE ’DatiAgenti.in’
INTO TABLE agenti
FIELDS TERMINATED BY ’,’;
Laboratorio di Sistemi Informativi – p. 28/30
Esportazione dati infrazioni
Volendo esportare i dati delle infrazioni nel file
DatiInfrazioni.out si può usare il comando:
SELECT * INTO OUTFILE ’DatiInfrazioni.out’
FIELDS TERMINATED BY ’,’
FROM infrazioni;
Si ottiene così il seguente file:
1,2005-10-25,567,44,FI,4E5432
2,2005-10-26,456,34,FI,4E5432
3,2005-10-26,456,34,FI,2F7643
4,2005-10-15,456,53,MI,2F7643
5,2005-10-12,567,44,MI,2F7643
Laboratorio di Sistemi Informativi – p. 29/30
Backup della base di dati
Il modo più comune per eseguire un backup è usare lo
script mysqldump dalla linea di comando del sistema.
Lo script si collega al server e crea un file di dump SQL
contenente i comandi SQL necessari per ricreare la
base di dati.
mysqldump -u NomeUtente -p
NomeDb > NomeFile;
In alternativa, si può eseguire il backup utilizzando
MySQL Administrator (ovviamente se si hanno i
privilegi per farlo).
Laboratorio di Sistemi Informativi – p. 30/30