Jorge Morales
Cada quien su religión!
Modificar tablas en MySQL es una tarea cotidiana cuando trabajas con bases de datos vivas. El comando ALTER TABLE te permite agregar, eliminar, renombrar y reformatear columnas sin reconstruir la estructura desde cero, algo clave cuando un cliente cambia los requisitos o detectas que olvidaste un detalle.
Las tablas no están escritas sobre piedra, y eso es justamente lo que hace tan poderoso este comando. Aquí verás cómo aplicarlo paso a paso sobre una tabla de prueba llamada test, con ejemplos reales de cada subcomando.
¿Cómo agregar una columna nueva con ALTER TABLE?
Para sumar una columna a una tabla existente, usas el subcomando ADD COLUMN indicando el nombre y el tipo de dato.
sql ALTER TABLE test ADD COLUMN price FLOAT;
Después de ejecutarlo, un DESC test te confirma que la columna price quedó registrada como float y permite valores nulos por defecto.
¿Qué hace ALTER TABLE en MySQL? Es el comando que modifica la estructura de una tabla ya creada. Te permite agregar columnas, borrarlas, cambiar tipos de dato o renombrar la tabla completa sin perder los datos existentes.
¿Puedo elegir la posición de la columna nueva?
Sí. Al final de la definición puedes usar FIRST para colocarla al inicio o AFTER nombre_columna para ubicarla después de una columna específica.
sql ALTER TABLE test ADD COLUMN price FLOAT AFTER quantity;
El orden de las columnas no impacta el rendimiento de las consultas ni de la tabla. Es, en gran medida, vanidad o comodidad visual. Lo importante es que entiendas qué guarda cada tabla, no si están en orden alfabético.
¿Cómo elimino una columna en MySQL?
Para borrar una columna usas DROP COLUMN seguido del nombre. No necesitas especificar nada más.
sql ALTER TABLE test DROP COLUMN price;
Después de ejecutar el comando, la columna desaparece por completo junto con cualquier dato que tuviera. Por eso conviene hacerlo con cuidado en bases de producción.
¿Cómo modificar el tipo de dato de una columna existente?
Cuando necesitas cambiar el tipo de dato o las restricciones, el subcomando es MODIFY COLUMN. Aquí entra en juego un tipo de dato muy útil para precisión numérica: decimal.
sql ALTER TABLE test MODIFY COLUMN price DECIMAL(10,3) NOT NULL;
En decimal(10,3), el primer número es la longitud total de dígitos y el segundo indica cuántos van después del punto decimal. Eso te permite guardar valores como 1234567.123. Es crítico en fintech, donde la regulación exige operar con una cantidad exacta de decimales y un float común no es suficiente.
¿Qué diferencia hay entre FLOAT y DECIMAL en MySQL? Float maneja punto flotante con precisión aproximada. Decimal almacena valores con precisión exacta, ideal para dinero y datos regulados donde un centavo perdido importa.
¿Qué cuidados debo tener al modificar columnas con datos?
La mayoría de las veces que ejecutes un MODIFY COLUMN, la tabla ya tendrá registros. Hay que asegurarse de que el nuevo tipo de dato sea compatible con el anterior.
"hola" a un tipo numérico, MySQL te marcará error porque no puede convertirlo.UPDATE y después borrar la original.No es buena práctica modificar columnas con frecuencia en bases de datos productivas. Sí sucede, pero las menos veces y siempre con sumo cuidado.
¿Existen sinónimos del tipo DECIMAL?
MySQL maneja aliases para varios tipos de datos. DECIMAL(M,P) tiene tres sinónimos exactos: NUMERIC, DEC y FIXED. Los cuatro hacen lo mismo, donde M es la longitud total del espacio numérico y P son los dígitos después del punto decimal.
Los valores por defecto dependen de la versión, pero típicamente M ronda los 10 o 20 y P los 7 o 10. Cada versión tiene su propia documentación.
¿Cómo renombrar una columna o una tabla completa?
Para cambiar el nombre de una columna sin tocar su tipo de dato, usas RENAME COLUMN.
sql ALTER TABLE test RENAME COLUMN price TO prices;
Y si quieres renombrar la tabla entera, el subcomando es RENAME TO.
sql ALTER TABLE test RENAME TO tests;
SQL es un lenguaje bastante natural, así que muchas veces puedes inferir el comando por su nombre.
¿Cómo agrego un valor por defecto a una columna ya existente?
La clave está en volver a declarar la columna completa con MODIFY COLUMN y sumarle lo nuevo. Mantienes el tipo igual y agregas la propiedad extra.
sql ALTER TABLE tests MODIFY COLUMN prices DECIMAL(10,3) NOT NULL DEFAULT 10;
Si ahora quisieras quitarle ese default, no puedes dejar DEFAULT NULL mientras la columna esté como NOT NULL, porque sería una contradicción. Tendrías que permitir nulos primero.
Con estos subcomandos del ALTER TABLE ya puedes moldear tus tablas como plastilina: agregar, borrar, mover, modificar y renombrar. ¿Tú en qué situación real has tenido que reescribir la estructura de una tabla? Cuéntame en los comentarios.
Dejo mi aporte sobre como eliminar las FOREIGN KEY de una tabla. En mi caso no rehice las tablas en la clase anterior para intentarlas modificar y dejarlas con la estructura de normalización suave. Aquí va. --Ejecutamos el siguiente comando SHOW CREATE TABLE bills; -- Con este comando mostramos la sintaxis de creación de la tabla. -- el fin de esto es conocer el nombre del constraint. -- que en este caso es "bills\_ibfk\_1". | bills | CREATE TABLE `bills` ( `bill_id` int unsigned NOT NULL AUTO_INCREMENT, `client_id` int unsigned NOT NULL, `total` float DEFAULT NULL, `status` enum('open','paid','lost') NOT NULL DEFAULT 'open', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `modified_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`bill_id`), KEY `client_id` (`client_id`), CONSTRAINT `bills_ibfk_1` FOREIGN KEY (`client_id`) REFERENCES `clients` (`client_id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | -- Ahora teniendo este dato creamos la Query para modificar la tabla de la siguiente forma: ALTER TABLE bills DROP FOREIGN KEY bills_ibfk_1; -- listo, volvemos a ejecutar SHOW CREATE para ver nuestra query; SHOW CREATE TABLE bills; -- Y vemos que ahora no existe la FOREIGN KEY. | bills | CREATE TABLE `bills` ( `bill_id` int unsigned NOT NULL AUTO_INCREMENT, `client_id` int unsigned NOT NULL, `total` float DEFAULT NULL, `status` enum('open','paid','lost') NOT NULL DEFAULT 'open', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `modified_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`bill_id`), KEY `client_id` (`client_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | -- Espero que les sea de utilidad esta ayuda.
Para eliminar o modificar las claves foráneas (foreign keys) en MySQL, utilizas el comando ALTER TABLE. Para eliminar una clave foránea, la sintaxis es:
ALTER TABLE nombre_tabla DROP FOREIGN KEY nombre_clave_foranea;
Para modificarla, primero debes eliminar la clave foránea existente y luego agregar una nueva con las especificaciones deseadas:
ALTER TABLE nombre_tabla DROP FOREIGN KEY nombre_clave_foranea;
ALTER TABLE nombre_tabla ADD CONSTRAINT nombre_clave_foranea FOREIGN KEY (columna) REFERENCES otra_tabla (columna_referenciada);
Esto permitirá gestionar las relaciones entre tablas de manera efectiva.
Jorge Morales
Cada quien su religión!
Juan Pablo Diaz Gonzalez
En esta clase como otras, recomiendo escribir en tablero o proyectar desde un ipad las temáticas conceptuales. Escribirlas en lenguaje o desde un bloc de notas, no es tan profesional.
Juan Jose Hernandez Garcia
El uso de decimal(10,3) en lugar de decimal(10,2) para la columna price se debe a la necesidad de tener mayor precisión en el manejo de precios. En decimal(10,3), se pueden almacenar hasta 10 dígitos en total, de los cuales 3 están después del punto decimal. Esto permite representar valores como 1234567.890 de manera precisa, lo cual es crucial en aplicaciones financieras donde la exactitud es fundamental.
Si solo se usara decimal(10,2), la precisión se limitaría a 2 decimales, lo que podría no ser suficiente para ciertos cálculos o requerimientos históricos.
Rodrigo Fonnegra Rodriguez
La verdad es que a mi también me daría algo ver columnas como created_at antes de columnas como precio, se supone que la fecha y la hora es como el dato final, incluso es así en los sistemas de archivos, normalmente va el peso (que en éste caso sería el precio) y luego va la fecha de modificación, no sé, se ve ordenado, pero me parece bien que no sea obligatoria esa regla.
Sergio de Jesús Huesca Nieva
Depende... en B.I. normalmente las tablas empiezan con los datos que categorizan y al final las metricas
Juan Diego Ussa Aponte
A veces las fechas se pueden tomar como el índice. Por ejemplo: al descargar de yfinance los precios historicos de un activo se toma como "id" o "index" la fecha
Miguel Angel Otero Otero
1. Analogía del Edificio en Construcción 🏢
Imagina que una Base de Datos es un gran distrito de la ciudad, y cada Tabla es un Edificio ya en uso. El comando ALTER TABLE es el permiso de construcción y la cuadrilla de obreros que te permite hacer cambios estructurales en ese edificio sin demolerlo.
Comando de MySQL
Acción
Analogía con el Edificio
ALTER TABLE ADD COLUMN
Agregar una nueva columna (ej: price).
Construir una nueva habitación o agregar un nuevo servicio (un ascensor, un balcón) a todos los pisos del edificio. Ahora todos los apartamentos tienen este nuevo espacio.
ALTER TABLE DROP COLUMN
Eliminar una columna (ej: price).
Demoler una habitación o quitar un servicio (como un viejo trastero) de todos los pisos del edificio. El espacio desaparece.
ALTER TABLE MODIFY COLUMN
Cambiar el tipo de dato (ej: de float a DECIMAL(10,3)).
Cambiar el uso o la naturaleza de una habitación existente. Por ejemplo, convertir la "habitación del hobby" (que era flexible) en una "caja fuerte con medidas exactas"(que requiere precisión decimal DECIMAL(10,3)).
ALTER TABLE RENAME TO
Renombrar la tabla (ej: de test a tests).
Cambiar el nombre del edificio completo. La estructura es la misma, pero el letrero de la entrada ahora es diferente.
Yerson Felipe Ramirez Garnica
Mi humilde aporte chavos :)
DROP TABLE IF EXISTS practicando_alter;
CREATE TABLE IF NOT EXISTS practicando_alter(
id integer unsigned primary key auto_increment,
nombre varchar(100),
create_at timestamp not null default current_timestamp
);
ALTER TABLE practicando_alter ADD COLUMN apellido VARCHAR(100);
ALTER TABLE practicando_alter DROP COLUMN apellido;
ALTER TABLE practicando_alter MODIFY COLUMN apellido varchar(200);
DESCRIBE practicando_alter;
ALTER TABLE practicando_alter RENAME COLUMN apellido to apellido2
Jefred Bedoya
ALTER TABLE es el comando esencial para evolucionar tu base de datos sin perder información. Permite modificar la estructura existente con precisión quirúrgica.
ADD o DROP COLUMN para ajustar campos.MODIFY o CHANGE actualizan definiciones.RENAME ajusta etiquetas de columnas o tablas.Julie Andrea Martinez Ramirez
en q programa esta creando las tablas?
Juan Diego Ussa Aponte
no lo sé, pero yo lo hago en el bloc de notas para escribir mejor.
Beatriz del Mar Jimenez Herrera
No se cual sea el editor, yo estoy usando VS Code, es similar.