sabato 25 giugno 2011

Aggiungere una colonna a una tabella DB2

Come inserire una colonna:

ALTER TABLE <schema_tabella>.<nome_tabella> ADD COLUMN <nome_colonna> <datatype>;
Esempio 1:
ALTER TABLE CATALOGO.MUSICA ADD COLUMN AUTORE VARCHAR(60);
Esempio 2:
ALTER TABLE CATALOGO.MUSICA ADD COLUMN ID CHAR(3) NOT NULL;
Esempio 3:
ALTER TABLE CATALOGO.MUSICA ADD COLUMN PREZZO_DISCO DECIMAL(5,2) ;

NOTA: E' possibile inserire colonne solo alla fine della tabella.
Se serve inserire una colonna in mezzo alle altre, è necessario creare una nuova tabella (mantenendo temporaneamente quella originaria) e ricreare la struttura della nuova tabella da zero inserendo anche la colonna aggiuntiva.

Posso fare in 2 modi:
1. Per inserire i dati nella tabella nuova (con la colonna in più), bisogna fare una INSERT di tutti i dati che si trovavano nella tabella di partenza. Ad esempio la insert inserisce in MUSICA2 i dati di MUSICA1, portandosi dietro anche i valori null e lasciando a null i valori relativi alla nuova colonna.


INSERT INTO CATALOGO.MUSICA2 (AUTORE,NOME_ALBUM,ANNO,PREZZO) (
select AUTORE,NOME_ALBUM,ANNO, PREZZO 
        from CATALOGO.MUSICA);

A questo punto si può eliminare la tabella originaria che ha una colonna in meno.


2. Altrimenti si può creare una nuova tabella con la colonna desiderata.
Faccio la export dei dati e della struttura della tabella, ma nella select metto anche la colonna (vuota) nella posizione in cui l'ho inserita nella create. A questo punto faccio la import sulla tabella.
Creo la nuova tabella con una colonna in più:
CREATE TABLE CATALOGO.MUSICA3  (
 AUTORE CHAR(50) NOT NULL ,
 TITOLO CHAR(50),
 NOME_ALBUM CHAR(50) NOT NULL ,
 ANNO INTEGER NOT NULL ,
 ETICHETTA CHAR(50) )
 IN USERSPACE1;

Faccio la export dei dati della tabella originale impostando il secondo campo come una stringa vuota (nella tabella originale infatti il secondo campo non esiste):
export to musica.ixf OF IXF select AUTORE, '', NOME_ALBUM, ANNO, ETICHETTA FROM CATALOGO.MUSICA;

Faccio la import dei dati esportati nella tabella nuova.
import from musica.ixf OF IXF insert into CATALOGO.MUSICA3;

Per esportare_importare i dati posso anche usare il formato .del invece del formato .ixf. La differenza tra i due metodi sta nel fatto che al momento dell'import, nella tabella la nuova colonna creata avrà dei valori NULL con la IXF, mentre avrà dei valori vuoti con la DEL.

Export/import in formato .del:
export to musica.del OF DEL select AUTORE, '', NOME_ALBUM, ANNO, ETICHETTA FROM CATALOGO.MUSICA;

import from musica.del OF DEL insert into CATALOGO.MUSICA3;

2 commenti:

  1. Ciao, spero mi puoi aiutare. Devo fare un import in ina tabella da un file .del , l'unico problema è che nella tabella c'è una colonna di nome TYPE di tipo VARCHAR che nel file del non c'è, e quindi durante l'import vorrei settare questa colonna ad un valore che decido io, per esempio "ONE". Lo devo fare durante l'import, perchè ho più file del e ad ognuno di questi corrisponde un diverso valore che devo mettere nella colonna TYPE....... Qualche suggerimento?

    RispondiElimina
  2. Ciao.
    Il .del dove l'hai ottenuto? Presumo esportando i dati da un'altra tabella simile a quella in cui vuoi importare i dati ma che non contiene la colonna TYPE. In questo caso la cosa più comoda è esportare i dati già nel formato che vuoi per caricarlo direttamente, ad esempio:
    export to tabella.del of del select campo1,campo2, 'ONE', campo3,campo4 from tabella1; dove 'ONE' è il valore che hai assegnato.
    Diversamente potresti modificare il file .del a mano con un editor di testo, i file .del sono il formato più semplice e non dovresti avere avere problemi con l'editing

    RispondiElimina