Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Definizione dei dati > Modifica di Tabelle
PrecedenteColonne di SistemaPrivilegiSuccessivo

5.5. Modifica di Tabelle

Quando si crea una tabella e ci si rende conto di aver commesso un errore, o le richieste dell'applicazione sono cambiate, è possibile eliminare la tabella e crearla di nuovo. Ma questa non è un'opzione conveniente se la tabella è già riempita con dati, o se la tabella è referenziata da altri oggetti del database (per esempio un vincolo chiave esterna). Perciò PostgreSQL™ mette a disposizione una famiglia di comandi per modificare tabelle esistenti. Notare che concettualmente questo è differente dall'alterazione dei dati contenuti nella tabella: qui siamo interessati nel modificare la definizione, o la struttura, della tabella.

You can:

  • Aggiungere colonne

  • Rimuovere colonne

  • Aggiungere vincoli

  • Rimuovere vincoli

  • Cambiare i valori di default

  • Cambiare i tipi di dato delle colonne

  • Rinominare colonne

  • Rinominare tabelle

Tutte queste azioni sono effettuate usando il comando ALTER TABLE(7), la cui pagina di riferimento contiene dettagli oltre a quelli descritti qui.

5.5.1. Aggiungere una colonna

Per aggiungere una colonna, usa il comando:

ALTER TABLE products ADD COLUMN description text;

La nuova colonna è inizialmente riempita con qualunque valore di default sia dato (null se non specifici una clausola DEFAULT )

Puoi anche definire vincoli sulla colonna allo stesso tempo, usando la sintassi usuale:

ALTER TABLE products ADD COLUMN description text CHECK (description <> '');

Infatti tutte le opzioni che possono essere applicate alla descrizione di una colonna in CREATE TABLE possono essere usate qui. Tieni a mente comunque che il valore di default deve soddisfare i vincoli dati, o la ADD fallirà. Alternativamente, puoi aggiungere vincoli più tardi (vedi sotto) dopo che hai riempito la nuova colonna correttamente.

[Suggerimento]

Suggerimento

Aggiungere una colonna con un default richiede l'aggiornamento di ogni riga della tabella (per immagazzinare il valore della nuova colonna). Comunque, se non specifici un default, PostgreSQL™ è capace di evitare l'aggiornamento fisico. Così se intendi riempire la colonna con valori non default principalmente, è meglio aggiungere al colonna senza default, inserisci i valori corretti usando UPDATE, e poi aggiungi qualsiasi default desirato come descritto sotto.

5.5.2. Rimuovere una Colonna

Per rimuovere una colonna, usa un comando tipo:

ALTER TABLE products DROP COLUMN description;

Qualsiasi dato nella colonna sparisce. Anche i vincoli di tabella coinvolti nella colonna sono eliminati. Comunque, se la colonna è referenziata da un vincolo chiave esterna di un'altra tabella, PostgreSQL™ non eliminerà silenziosamente quel vincolo. Puoi autorizzare l'eliminazione di tutto quello che depende dalla coklonna aggiungendo CASCADE:

ALTER TABLE products DROP COLUMN description CASCADE;

Vedi Sezione 5.11, «Dipendenze» per una descrizione del meccanismo generale che sta sotto.

5.5.3. Aggiungere un vincolo

To add a constraint, the table constraint syntax is used. For example: Per aggiungere un vincolo, si usa la sintassi dei vincoli di tabella. Per esempio:

ALTER TABLE products ADD CHECK (name <> '');
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;

Per aggiungere un vincolo not-null, che non può essere scritto come vincolo di tabella, usa questa sintassi:

ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;

Il vincolo sarà controllato immediatamente, così la tabella dovrà soddisfarlo prima che possa essere aggiunto.

5.5.4. Rimuovere un Vincolo

Per rimuovere un vincolo devi conoscerne il nome. Se gli hai dato un nome allora è semplice. Altrimenti il sistema gli ha assegnato un nome generato, che devi scoprire. Il comando psql \d tablename può essere utile qui; Anche altre interfaccie potrebbero avere un modo per ispezionare i dettagli di una tabella. Quindi il comando è:

ALTER TABLE products DROP CONSTRAINT some_name;

(Se hai a che fare con un nome di vincolo generato, tipo $2, non dimenticare che avrai bisogno di metterlo tra doppie virgolette per renderlo un identificatore valido.)

Come con la cancellazione di una colonna, devi aggiungere CASCADE se vuoi eliminare un vincolo da cui dipende qualcos'altro. Un esempio è che un vincolo chiave esterna dipende da un vincolo unique o chiave primaria sulla/e colonna/e referenziata.

Questo funziona allo stesso modo per tutti i tipi di vincoli ad eccezione dei vincoli not-null. Per eliminare un vincolo not null usa:

ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;

(Ricorda che i vincoli not null non hanno nomi.)

5.5.5. Cambiare il Valore di Default di una Colonna

Per impostare un nuovo default per una colonna, usa un comando tipo:

ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;

Notare che questo non interessa nessuna delle righe esistenti nella tabella, cambia solamente il default per i futuri comandi INSERT.

Per rimuovere ogni valore di default, usa:

ALTER TABLE products ALTER COLUMN price DROP DEFAULT;

Effettivamente questo è lo stesso di impostare il default a null. Come conseguenza, non è un errore eliminare un default dove non è stato definito, perchè il default è implicitamente il valore null.

5.5.6. Cambiare il Tipo di Dato di una Colonna

Per convertire una colonna a un diverso tipo di dato, usa un comando come:

ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);

Questo andrà a buon fine solo se ogni valore esistente nella colonna può essere convertito al nuovo tipo da un cast implicito. Se è necessaria una conversione più complessa, puoi aggiungere una clausola USING che specifica come calcolare il nuovo valore dal vecchio.

PostgreSQL™ tenterà di convertire il valore di default della colonna (se esistente) al nuovo tipo, così come qualsiasi vincolo che coinvolge la colonna. Ma queste conversioni potrebbero fallire, o potrebbero produrre risultati sorprendenti. Spesso è meglio eliminare qualsiasi vincolo sulla colonna prima di modificarne il tipo, e poi rimettere dopo vincoli corretti.

5.5.7. Rinominare una Colonna

Per rinominare una colonna:

ALTER TABLE products RENAME COLUMN product_no TO product_number;

5.5.8. Rinominare una Tabella

Per rinominare una tabella:

ALTER TABLE products RENAME TO items;

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Definizione dei dati > Modifica di Tabelle
PrecedenteColonne di SistemaPrivilegiSuccessivo