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