Ir al contenido
wannacode

ALTER TABLE: cambiar una tabla

En resumen: ALTER TABLE añade columnas a una tabla existente, las renombra o las quita; SQLite solo puede eso, para todo lo demás se construye una tabla nueva, y DROP TABLE elimina la tabla entera.

Problema

Llama el mensajero

El mensajero llega, y el cliente no abre la puerta. El mensajero quiere un número de teléfono. En customers no hay una columna para el teléfono.

La tabla no se puede crear otra vez: contiene 20 clientes con pedidos, reseñas y fechas de registro. Hay que cambiarla en el sitio.

La idea

ADD COLUMN

ALTER TABLE cambia una tabla que ya existe. ADD COLUMN añade una columna, escrita como en CREATE TABLE:

SQLbase de datos: tienda

Los clientes existentes recibieron NULL: sus teléfonos todavía no se conocen. Los datos de las demás columnas no se tocan.

Míralo

Una columna obligatoria en una tabla llena

Marketing quiere una columna «el cliente aceptó el boletín», y obligatoria:

SQLbase de datos: tienda

Un error. La tabla ya tiene 20 filas. Si la columna es NOT NULL, ¿qué debe contener para ellas? SQLite no lo sabe, así que se niega.

Con DEFAULT sí lo sabe:

SQLbase de datos: tienda

Todos los clientes existentes recibieron 0: no han aceptado hasta que digan lo contrario.

Más precisamente, para curiosos

SQLite tiene más límites con ADD COLUMN. La columna nueva no puede ser UNIQUE ni PRIMARY KEY. Si tiene REFERENCES y la comprobación está activada, DEFAULT debe ser NULL. Un CHECK en la columna nueva está permitido: SQLite lo comprueba también con las filas existentes.

Pruébalo

La unidad

Los productos se venden por unidad, pero pronto algunos se venderán por kilo. Añade a products una columna unit: texto, obligatoria, con el valor por defecto 'ud.'.

SQLbase de datos: tienda

La idea

RENAME COLUMN y DROP COLUMN

RENAME COLUMN cambia el nombre de una columna. Los datos se quedan:

SQLbase de datos: tienda

SQLite cambia el nombre también en el resto del esquema donde se menciona la columna.

DROP COLUMN quita una columna junto con sus datos. La tienda nunca va a enviar un fax:

SQLbase de datos: tienda

DROP COLUMN existe en SQLite desde la versión 3.35 (2021). No puede quitar una columna de la que depende el esquema: una clave primaria, una columna UNIQUE, o una columna que usa un índice o una vista.

SQLbase de datos: tienda

La idea

Lo que SQLite no puede hacer

El almacén quiere que las existencias nunca sean negativas. Eso es CHECK (stock >= 0) en una columna que ya existe:

SQLbase de datos: tienda

SQLite no puede añadir una regla a una columna existente, ni cambiar su tipo. En SQLite, ALTER TABLE solo puede añadir, renombrar y quitar columnas, y renombrar la tabla.

Para todo lo demás se hace una tabla nueva. Así es como las reseñas pasan a tener que llevar texto:

SQLbase de datos: tienda

Cuatro pasos: una tabla nueva con la regla, copiar los datos con INSERT … SELECT, DROP TABLE de la antigua y RENAME TO de la nueva. Si una reseña no hubiera tenido texto, la copia se habría detenido en NOT NULL. Entonces primero arreglas los datos.

Más precisamente, para curiosos

PostgreSQL y MySQL pueden más: ALTER TABLE products ADD CONSTRAINT stock_ok CHECK (stock >= 0) y cambiar el tipo de una columna. Para SQLite el procedimiento completo está en la documentación («ALTER TABLE», la sección sobre cambios que no admite directamente). También tiene pasos para las claves foráneas, los índices y los triggers de la tabla antigua. Las reseñas no tienen ninguno de ellos, así que aquí bastan cuatro pasos.

La idea

DROP TABLE

DROP TABLE quita la tabla entera, con todos sus datos. No hay deshacer. La promoción de 2025 terminó hace tiempo:

SQLbase de datos: tienda

sqlite_schema es la lista de tablas de SQLite. promo_2025 ya no está. La segunda línea no da error gracias a IF EXISTS. Sin él, quitar una tabla que no existe se detiene:

SQLbase de datos: tienda

Una tabla a la que apuntan otras tablas no se puede quitar así. order_items y reviews apuntan a products:

SQLbase de datos: tienda

DROP TABLE primero borra todas las filas, y REFERENCES de la lección anterior no lo permite.

Ejercicio

Dos cambios

1. Los mensajeros quieren un teléfono y una nota de entrega («timbre 3, portal B»).

Añade a customers las columnas phone y delivery_note, ambas de texto.

SQLbase de datos: tienda

2. En reviews la fecha se llama created_at, y en products se llama added_at. Lo que es igual debería llamarse igual.

Renombra added_at de products a created_at.

SQLbase de datos: tienda

En un proyecto real el esquema no se cambia a mano en una consola, sino con migraciones: archivos con sentencias ALTER TABLE como estas, que se ejecutan en el mismo orden en cada computadora y servidor. Las verás en el módulo sobre la base de datos en el programa.

Test

Ponte a prueba

1. Añades una columna phone TEXT a una tabla con 20 clientes. ¿Qué hay en ella para los clientes existentes?
2. ¿Por qué ADD COLUMN newsletter INTEGER NOT NULL se detiene con un error?
3. ¿Cómo añades un CHECK a una columna existente en SQLite?
4. ¿Qué hace DROP TABLE IF EXISTS promo_2025 si la tabla no existe?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·