CodeGym /Corsi /SQL SELF /Modifica dei tipi di dati delle colonne

Modifica dei tipi di dati delle colonne

SQL SELF
Livello 18 , Lezione 1
Disponibile

Immagina di dover creare una tabella degli studenti per l'università. Di nuovo! :)

All'inizio decidi che il campo per l'età age sarà un intero e imposti il tipo SMALLINT (va bene per numeri da -32,768 a 32,767). Però, col tempo, il database cresce e aggiungi info su studenti da altri paesi che indicano l'età... in giorni dalla nascita! Qui il tuo SMALLINT inizia a stare stretto — è ora di passare, per esempio, a INTEGER.

Ecco altri casi comuni in cui devi cambiare tipo di dato:

  1. Aumentare o diminuire l'intervallo dei numeri.
  2. Modificare la lunghezza delle stringhe (tipo da VARCHAR(50) a VARCHAR(100)).
  3. Passare a un altro tipo di dato per ottimizzare (ad esempio, convertire TEXT in VARCHAR).
  4. Errore nella scelta iniziale del tipo della colonna (tipo hai messo BOOLEAN invece di INTEGER).

Sintassi del comando per cambiare tipo di dato

In PostgreSQL, per cambiare il tipo di dato di una colonna si usa il comando ALTER TABLE. Ti permette di adattare la struttura della tabella alle nuove esigenze.

ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type;

Facile: indichi il nome della tabella, la colonna che vuoi cambiare e il nuovo tipo di dato.

Esempio 1: Da INTEGER a BIGINT

Supponiamo di avere una tabella degli studenti:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INTEGER
);

Tutto ok, finché l'età non supera milioni di anni (non chiedere, è solo un esempio!). Per tranquillizzare PostgreSQL, cambiamo il tipo della colonna age da INTEGER a BIGINT:

ALTER TABLE students
ALTER COLUMN age TYPE BIGINT;

Esempio 2: Aumentare la lunghezza della stringa

Hai creato una tabella per i corsi e hai detto che i nomi saranno lunghi fino a 50 caratteri:

CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50)
);

Ma poi scopri che i nomi dei corsi sono molto più complicati e lunghi di quanto pensavi. Problema risolto facilmente:

ALTER TABLE courses
ALTER COLUMN name TYPE VARCHAR(150);

Esempio 3: Conversione dei tipi

Mettiamo che avevi una tabella dove il campo birth_date era salvato come testo:

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    birth_date TEXT
);

Ti rendi conto che lavorare con le date in formato TEXT non è il massimo, perché non puoi filtrare o ordinare. Soluzione? Convertiamo TEXT in DATE:

ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE USING birth_date::DATE;

Nota la parte USING birth_date::DATE. Dice a PostgreSQL che deve convertire i dati prima di cambiare tipo.

Perché a volte serve la conversione esplicita dei dati?

Quando PostgreSQL cambia tipo, prova a convertire automaticamente i dati esistenti al nuovo tipo. Se non ci riesce, ti dà errore. Per esempio, cambiare un campo TEXT in INTEGER senza dire come interpretare i dati testuali fallirà.

Esempio di problema

ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE;
-- Errore: impossibile convertire il valore 'not a date' in tipo DATE.

Questo problema ha una soluzione. Aggiungi la conversione esplicita dei dati usando USING:

ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE USING to_date(birth_date, 'YYYY-MM-DD');

Qui usiamo la funzione to_date() per convertire le stringhe in formato data.

Il comando USING

In PostgreSQL, quando cambi il tipo di una colonna con ALTER TABLE ... ALTER COLUMN ... TYPE, a volte devi dire come convertire i dati esistenti — ed è qui che entra in gioco la parola chiave USING.

Sintassi:

ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type
USING expression;

Spiegazione:

  • USING ti permette di specificare la formula di conversione dei valori dal vecchio tipo al nuovo.
  • È super utile quando la conversione automatica non è possibile o è ambigua.

Esempio semplice: stringa → numero

ALTER TABLE users
ALTER COLUMN age TYPE INTEGER
USING age::INTEGER;

Qui age era inizialmente di tipo TEXT, e vogliamo convertirlo in INTEGER. USING age::INTEGER è una conversione esplicita.

Esempio: testo → data

ALTER TABLE events
ALTER COLUMN event_date TYPE DATE
USING TO_DATE(event_date, 'YYYY-MM-DD');

Se event_date era testo tipo '2023-10-25', diciamo a PostgreSQL come trasformarlo in tipo DATE.

Quando USING è obbligatorio?

  • Quando non c'è una conversione diretta tra i tipi.
  • Quando i dati vanno trasformati.
  • Quando i tipi sono incompatibili (TEXTBOOLEAN, VARCHARINTEGER ecc.).

Errori tipici quando cambi tipo di dato

Errore se manca la conversione dei dati. Se i dati non possono essere convertiti automaticamente al nuovo tipo, devi per forza specificare la conversione con USING.

ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE;
-- Errore: la colonna 'birth_date' contiene valori non validi per il tipo DATE

L'operazione blocca la tabella. Ricorda che cambiare tipo di dato può bloccare la tabella in scrittura finché l'operazione non finisce. Questo è importante soprattutto per tabelle grandi. Pianifica i cambi nei momenti di bassa attività.

Problemi con tabelle collegate e chiavi esterne. Se la colonna fa parte di una chiave esterna, cambiare tipo può essere più complicato. PostgreSQL ti chiederà di ricreare le chiavi esterne.

Consigli utili

Controlla sempre i dati attuali. Usa query tipo SELECT DISTINCT column_name prima di cambiare tipo, così capisci se puoi convertire i dati senza errori.

Testa i cambiamenti. Crea una copia temporanea della tabella e fai esperimenti prima di cambiare quella vera. Tipo:

CREATE TEMP TABLE temp_students AS SELECT * FROM students;

Non dimenticare USING. È il tuo salvatore quando il tipo di dato cambia radicalmente (tipo TEXTNUMERIC).

Ora sai come cambiare il tipo di dato di una colonna in PostgreSQL. Spero che la prossima volta che dovrai rivedere la struttura dei dati, sarai sicuro di te. Le tabelle sono smart, ma anche loro a volte hanno bisogno di un upgrade!

2
Compito
SQL SELF, livello 18, lezione 1
Bloccato
Aumento della lunghezza della stringa
Aumento della lunghezza della stringa
2
Compito
SQL SELF, livello 18, lezione 1
Bloccato
Conversione di una colonna data
Conversione di una colonna data
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION