Vai al contenuto
eLearner.app
Modulo 9 · Lezione 3 di 435/57 nel corso~10 min
Lezioni del modulo (3/4)

Modificare la struttura: ALTER TABLE

Le esigenze di un'applicazione cambiano nel tempo, e il database deve tenere il passo. ALTER TABLE è il commando (estremamente versatile) dedicato a modificare schemi di tabelle esistenti senza doverle cancellare (rischiando i dati al loro interno).

Modificare le Colonne (ADD / DROP / ALTER)

Aggiungere una colonna richiede un accorgimento. Se la tabella contiene già dei dati, aggiungere una colonna "NOT NULL" manderà Postgres in errore: cosa dovrebbe inserire nelle vecchie righe? Devi associare un DEFAULT.

SQL
-- Aggiungiamo una colonna
ALTER TABLE users ADD COLUMN age INTEGER; -- Ok, sarà NULL ovunque

-- Aggiungiamo NOT NULL, quindi diamogli un deafult
ALTER TABLE users ADD COLUMN active BOOLEAN NOT NULL DEFAULT true;

-- Cancellare una colonna (ATTENZIONE! i dati andranno persi)
ALTER TABLE users DROP COLUMN age;

Non solo aggiungere o rimuovere: spesso bisogna ri-configurare il tipo di una colonna o un suo vincolo:

SQL
-- Cambia il tipo di dato (postgreSQL farà un 'cast' dei dati esistenti se possibile)
ALTER TABLE users ALTER COLUMN username TYPE VARCHAR(100);

-- Aggiunge il vincolo NOT NULL
ALTER TABLE users ALTER COLUMN username SET NOT NULL;

-- Rimuove il vincolo NOT NULL (ritorna ad accettare null)
ALTER TABLE users ALTER COLUMN username DROP NOT NULL;

Aggiungere Vincoli (Constraints) a runtime

Esattamente come per la CREATE TABLE, possiamo usare ALTER TABLE per attaccare un CONSTRAINT a una tabella già in uso sull'app di produzione.

SQL
-- Aggiungi un nuovo Foreign Key
ALTER TABLE orders
  ADD CONSTRAINT fk_order_status FOREIGN KEY (status_id) REFERENCES statuses(id);

-- Aggiungi un CHECK
ALTER TABLE products
  ADD CONSTRAINT price_positive CHECK (price > 0);

-- E per distruggerli?
ALTER TABLE products DROP CONSTRAINT price_positive;

Modificare il nome

Sia colonne che tabelle possono essere rinominate:

SQL
ALTER TABLE users RENAME TO auth_users;
ALTER TABLE auth_users RENAME COLUMN username TO login_name;

Prova tu

Esercizio#sql.m9.l3.e1
Tentativi: 0Caricamento…

La tabella 'products' attualmente possiede una colonna 'name'. Modifica la tabella rinominando la colonna 'name' in 'title'. Usa l'operazione RENAME COLUMN.

Caricamento editor…
Mostra suggerimento

Sintassi: ALTER TABLE ... RENAME COLUMN ... TO ...

Soluzione disponibile dopo 3 tentativi

Aggiungere Vincoli in post-produzione

Esercizio#sql.m9.l3.e2
Tentativi: 0Caricamento…

Modifica la tabella 'products' aggiungendo un vincolo CHECK (chiamato 'verifica_prezzo') che imponga che il prezzo (colonna 'price') sia maggiore di 0. Il vincolo va aggiunto senza cancellare la colonna originaria.

Caricamento editor…
Mostra suggerimento

Sintassi: ALTER TABLE tabella ADD CONSTRAINT nome CHECK (...)

Soluzione disponibile dopo 3 tentativi