Imagina que estás diseñando una base de datos para una universidad. Al principio, la tabla de estudiantes solo tiene dos campos: ID y nombre. Todo sencillo, los estudiantes empiezan a usar el sistema. Pero al mes vienen los profes y te dicen: "¿Y si añadimos la edad?", y un poco después: "Hace falta también el email". Y luego: "Oye, ¿por qué no quitamos de una vez el campo middle_name, si nadie lo rellena?". Aquí es donde te van a venir genial las skills con ALTER TABLE para añadir y eliminar columnas.
Sintaxis para añadir columnas
Bueno, para añadir una columna nueva a una tabla existente en PostgreSQL, se usa el comando ALTER TABLE. Mira la sintaxis:
ALTER TABLE table_name
ADD COLUMN column_name data_type [constraints];
table_name— el nombre de la tabla donde quieres añadir la nueva columna.column_name— el nombre de la columna que quieres añadir.data_type— el tipo de dato, por ejemplo,VARCHAR,INTEGERoDATE.constraints(parámetro opcional) — restricciones que quieres poner a esa columna, comoNOT NULL,DEFAULT, etc.
Ejemplo: añadimos una nueva columna
Supón que tenemos la tabla students, que ya fue creada antes:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
De repente te piden añadir la columna age para guardar la edad de los estudiantes. Así se hace:
ALTER TABLE students
ADD COLUMN age INTEGER;
Ahora la estructura de la tabla students queda así:
| id | name | age |
|---|---|---|
| 1 | Eva | NULL |
| 2 | Alex | NULL |
Si añades nuevos registros sin especificar la edad, PostgreSQL pondrá automáticamente NULL, porque no hemos puesto ninguna restricción como NOT NULL ni un valor por defecto (DEFAULT).
Sintaxis para eliminar columnas
Eliminar una columna de una tabla también se hace con el comando ALTER TABLE. Así es la sintaxis:
ALTER TABLE table_name
DROP COLUMN column_name [RESTRICT | CASCADE];
table_name— el nombre de la tabla de la que quieres quitar la columna.column_name— el nombre de la columna que vas a eliminar.RESTRICT— prohíbe eliminar la columna si hay referencias a ella (por defecto).CASCADE— elimina la columna junto con todas sus dependencias.
Sobre el borrado en cascada de dependencias te cuento más en el siguiente nivel :P
Ejemplo: eliminamos una columna que ya no hace falta
Volvamos a la tabla students. Decidimos que el campo age ya no hace falta. Lo quitamos así:
ALTER TABLE students
DROP COLUMN age;
Ahora la estructura de la tabla vuelve a ser más simple:
| id | name |
|---|---|
| 1 | Eva |
| 2 | Alex |
Ejemplos útiles
Añadir una columna con restricciones
¿Y si quisieras añadir la columna age, pero con la restricción NOT NULL y un valor por defecto? Te serviría este código:
ALTER TABLE students
ADD COLUMN age INTEGER NOT NULL DEFAULT 18;
Ahora en todas las filas que ya existen, la columna age tendrá el valor 18, y los nuevos registros tendrán que poner un valor para ese campo, a menos que uses el valor por defecto.
Eliminar una columna con dependencias
Si una columna tiene dependencias (por ejemplo, se usa en vistas o triggers), tendrás que usar el modificador CASCADE. Pero ojo: esto puede afectar a otros objetos en tu base de datos. Por ejemplo:
ALTER TABLE students
DROP COLUMN email CASCADE;
Errores típicos y particularidades
Error: añadir una columna con el tipo de dato incorrecto.
Imagina que añades una columna de tipo INTEGER, pero intentas guardar texto en ella. PostgreSQL no te va a entender y te dará error al añadir registros. El tipo de dato siempre tiene que coincidir con lo que vas a guardar.
Error: eliminar una columna sin tener en cuenta las dependencias.
Por ejemplo, si eliminas una columna a la que apuntan índices o claves foráneas, PostgreSQL puede dar error si no pones el modificador CASCADE.
Error: eliminar una columna con dependencias. Por ejemplo, si eliminas una columna a la que apuntan índices o claves foráneas, PostgreSQL puede dar error si no pones el modificador CASCADE. Lo pusiste y borraste miles de filas que apuntaban a tu columna eliminada. Que no hacía falta borrar : (
Particularidad: el orden de los cambios.
A veces, añadir columnas con restricciones requiere saber el orden de las operaciones. Por ejemplo, si añades una columna con NOT NULL, primero tienes que rellenarla con valores por defecto, si no PostgreSQL te dará error.
GO TO FULL VERSION