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.
-- 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:
-- 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.
-- 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:
ALTER TABLE users RENAME TO auth_users;
ALTER TABLE auth_users RENAME COLUMN username TO login_name;Prova tu
La tabella 'products' attualmente possiede una colonna 'name'. Modifica la tabella rinominando la colonna 'name' in 'title'. Usa l'operazione RENAME COLUMN.
Mostra suggerimento
Sintassi: ALTER TABLE ... RENAME COLUMN ... TO ...
Soluzione disponibile dopo 3 tentativi
Aggiungere Vincoli in post-produzione
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.
Mostra suggerimento
Sintassi: ALTER TABLE tabella ADD CONSTRAINT nome CHECK (...)
Soluzione disponibile dopo 3 tentativi