Imagina que estás creando una tabla de estudiantes para la uni. ¡Otra vez! :)
Al principio decides que el campo para la edad age será un entero y le pones el tipo SMALLINT (sirve para números de -32,768 a 32,767). Pero con el tiempo, la base de datos crece y agregas info de estudiantes de otros países, ¡que ponen la edad... en días desde el nacimiento! Ahora tu SMALLINT se queda corto — toca cambiarlo, por ejemplo, a INTEGER.
Aquí tienes algunos casos típicos donde hay que cambiar el tipo de dato:
- Aumentar o reducir el rango de números.
- Cambiar la longitud de cadenas (por ejemplo, de
VARCHAR(50)aVARCHAR(100)). - Pasar a otro tipo de dato para optimizar (por ejemplo, convertir
TEXTaVARCHAR). - Error al elegir el tipo de columna al principio (por ejemplo, pusiste
BOOLEANen vez deINTEGER).
Sintaxis del comando para cambiar el tipo de dato
En PostgreSQL, cambiar el tipo de dato de una columna se hace con el comando ALTER TABLE. Te deja adaptar la estructura de la tabla a nuevas necesidades.
ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type;
Así de fácil: pones el nombre de la tabla, la columna que quieres cambiar y el nuevo tipo de dato.
Ejemplo 1: De INTEGER a BIGINT
Supón que tienes una tabla de estudiantes:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER
);
Todo iba bien hasta que la edad superó los millones de años (no preguntes, ¡es solo un ejemplo!). Para que PostgreSQL no se queje, cambiamos el tipo de la columna age de INTEGER a BIGINT:
ALTER TABLE students
ALTER COLUMN age TYPE BIGINT;
Ejemplo 2: Aumentar la longitud de una cadena
Creaste una tabla para guardar cursos y pusiste que los nombres tendrían hasta 50 caracteres:
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);
Peeeero resulta que los nombres de los cursos son mucho más largos de lo que pensabas. La solución es fácil:
ALTER TABLE courses
ALTER COLUMN name TYPE VARCHAR(150);
Ejemplo 3: Conversión de tipos
Digamos que teníamos una tabla donde el campo birth_date era texto:
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
birth_date TEXT
);
Te das cuenta de que trabajar con fechas como TEXT es un rollo, porque no puedes filtrar ni ordenar bien. ¿Solución? Convertimos TEXT a DATE:
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE USING birth_date::DATE;
Ojo a la parte USING birth_date::DATE. Le dice a PostgreSQL que tiene que convertir los datos antes de cambiar el tipo.
¿Por qué a veces hace falta conversión explícita de datos?
Cuando PostgreSQL se encuentra con un cambio de tipo, intenta convertir los datos automáticamente al nuevo tipo. Si no puede, da error. Por ejemplo, cambiar un campo TEXT a INTEGER sin decirle cómo interpretar los textos va a fallar.
Ejemplo de problema
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE;
-- Error: no se puede convertir el valor 'not a date' al tipo DATE.
Este problema tiene solución. Añade una conversión explícita usando USING:
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE USING to_date(birth_date, 'YYYY-MM-DD');
Aquí usamos la función to_date() para convertir cadenas a fechas.
El comando USING
En PostgreSQL, cuando cambias el tipo de una columna con ALTER TABLE ... ALTER COLUMN ... TYPE, a veces tienes que decir cómo convertir los datos existentes — y ahí entra la palabra clave USING.
Sintaxis:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type
USING expression;
Explicación:
USINGte deja indicar la fórmula de conversión de valores del tipo viejo al nuevo.- Esto es súper útil cuando la conversión automática no es posible o es ambigua.
Ejemplo sencillo: cadena → número
ALTER TABLE users
ALTER COLUMN age TYPE INTEGER
USING age::INTEGER;
Aquí age era originalmente TEXT, y queremos convertirlo a INTEGER. USING age::INTEGER es una conversión explícita de tipos.
Ejemplo: texto → fecha
ALTER TABLE events
ALTER COLUMN event_date TYPE DATE
USING TO_DATE(event_date, 'YYYY-MM-DD');
Si event_date era texto tipo '2023-10-25', le decimos a PostgreSQL cómo convertirlo al tipo DATE.
¿Cuándo es obligatorio USING?
- Cuando no hay conversión directa de tipos.
- Cuando los datos necesitan transformarse.
- Cuando los tipos son incompatibles (
TEXT→BOOLEAN,VARCHAR→INTEGER, etc.).
Errores típicos al cambiar tipos de datos
Error por no convertir los datos. Si los datos no se pueden convertir automáticamente al nuevo tipo, tienes que indicar cómo hacerlo con USING.
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE;
-- Error: la columna 'birth_date' contiene valores no válidos para el tipo DATE
La operación bloquea la tabla. Ten en cuenta que cambiar el tipo de dato puede bloquear la tabla para escritura hasta que termine la operación. Esto es importante en tablas grandes. Haz los cambios en horas de poca actividad.
Problemas con tablas relacionadas y claves foráneas. Si la columna es parte de una clave foránea, cambiar su tipo puede ser más complicado. PostgreSQL te pedirá recrear las claves foráneas.
Consejos útiles
Revisa siempre los datos actuales. Usa consultas como SELECT DISTINCT column_name antes de cambiar el tipo, para ver si los datos se pueden convertir sin errores.
Prueba los cambios. Haz una copia temporal de la tabla y experimenta antes de tocar la tabla principal. Por ejemplo:
CREATE TEMP TABLE temp_students AS SELECT * FROM students;
No olvides USING. Es tu salvavidas cuando el tipo de dato cambia mucho (por ejemplo, TEXT → NUMERIC).
Ahora ya sabes cómo cambiar el tipo de dato de una columna en PostgreSQL. Espero que la próxima vez que tengas que revisar la estructura de tus datos, te sientas seguro. Las tablas son listas, pero hasta ellas a veces necesitan un upgrade!
GO TO FULL VERSION