viernes, 14 de febrero de 2014

Agregar un campo a una Tabla MySQL

Aunque ya habíamos escrito un artículo parecido de ¿Cómo modificar una Tabla MySQL?, en esta ocasión partiremos de una situación práctica.

Este artículo, supone que se tiene una base de Datos MySQL en un servidor LAMP o WAMP y se gestiona su modelo de datos, diagrama Entidad-Relación, usando MySQL Workbench en conjunto con la Terminal MySQL.

En muchas ocasiones nos vemos enfrentado a modificaciones de nuestra base de datos, consecuencia de ampliaciones del modelo de datos diseñado por MySQL Workbench, y nos vemos con dificultades en migrar esos cambios a la base de datos en operación.

Si la base de datos no fue diseñada por MySQL Workbench, ese no es un problema, pues se puede crear el modelo de datos usando el mismo MySQL Workbench a partir de una base de datos en operación, esa es una de las facilidades de la aplicación.

En MySQL Workbench es muy simple migrar todo el modelo de datos (esquema EER) en el servidor MySQL. Sin embargo, cuando se requiere efectuar una actualización de algunas tablas de la base de datos en operación, su ejecución no es tan directa.

Naturalmente, se puede usar un administrador de MySQL intermediario como lo es phpMyAdmin, pero en general no es la operación más rápida y efectiva. Una mejor alternativa es usar la consola del servidor MySQL y desde ese punto mostraremos como hacer los cambios...

¿Cómo agregar un nuevo campo a la Tabla MySQL?

Ingresamos a la consola del servidor MySQL y seleccionamos la base de datos donde se encuentra la tabla a modificar, usando el SQL:

show databases;
use nombre_db;

Llevar a cabo la modificación de la tabla es cuestión de segundos, abriendo un editor de textos y copiando la seudo-instrucción SQL que mostramos a continuación. Esta seudo-instrucción SQL permite ubicar el nuevo campo en una posición determinada dentro de la tabla:

ALTER TABLE `nombre_tabla` 
ADD ##definición_de_campo##
AFTER `title`;

En este ejemplo, queremos que el nuevo campo queda ubicado justo debajo del campo cuyo nombre es title:

Si no hubieramos agregado el último comando, en este caso ALTER, el servidor MySQL colocaría el nuevo campo al final de los campos originales de la tabla. Si la situación deseada es distinta, por ejemplo deseamos crear el nuevo campo en la tabla y ubicarlo en la primera posición, entonces se usa la consulta SQL:
ALTER TABLE nombre_tabla ADD ##definición_de_campo## FIRST;

Aún no podemos ejecutar directamente el comando anterior en la terminal MySQL, pues nos faltaría escribir la información correspondiente a la definición del nuevo campo (##definicióndecampo##). Justo en esta labor interviene MySQL Workbench.

Usando MySQL Workbench

Aquí seleccionamos la tabla del diagrama EER y hacemos clic con el botón derecho del mouse e indicamos la acción 'Copy SQL to Clipboard'. Para inmediatamente ir al editor de textos donde teníamos la seudo-sintaxis SQL y seleccionamos el texto ##definición_de_campo## para pergar el contenido generado por MySQL Workbench, haciendo 'Crt + V' obtenemos la instrucción completa que podría ser, por ejemplo:

ALTER TABLE `images` 
ADD `alias` VARCHAR(140) NULL 
AFTER `title`;  

Así sólo nos resta, seleccionar el texto anterior con la sintásis definitiva, para copiarlo e ir a la terminal del servidor MySQL y desde fuera, hacer clic con el botón derecho del mouse seleccionar la opción 'Pegar'.

Agregando múltiples campos a la Tabla

La instrucción SQL es muy similar a la anterior, sólo hay que agregar las veces que se requiera la línea ADD junto con la definición del campo separándolas por una coma, por ejemplo:

ALTER TABLE `tb_name` 
ADD `alias` VARCHAR(140) NULL AFTER `title`,
ADD `created` DATETIME NOT NULL AFTER `uri`;

Si cometemos un error al agregar un campo a la tabla MySQL, sólo debemos eleminarlo usando la instrucción SQL:
ALTER TABLE nombre_tabla DROP nombre_campo;

Reordenar los campos de una Tabla MySQL

Hay ocasiones en que no deseamos agregar nuevos, sino que modificar el orden de los campos existentes en la tabla. Aunque no existe un comando específico en MySQL para llevar a cabo esa acción, sólo es posible reordenar la tabla campo por campo individualmente, lo cual puede ser tedioso para tablas con muchos campos.

El procedimiento a emplear es crear una nueva tabla vacía, con el orden correcto de los campos. Luego transferir los datos de la antigua tabla a la nueva tabla, por ejemplo:

Supongamos que tenemos la tabla 'menus' con los campos:

`alias`  
`title` 

Y deseamos lograr una tabla que los campos se ordenen así:

`title`   
`alias`

Entonces creamos una tabla vacía con el nombre 'new_menus' y los campos ordenados según nuestro deseo:

CREATE  TABLE `new_table` (  
    `id` INT NOT NULL AUTO_INCREMENT,  
    `title` VARCHAR(45) NOT NULL,  
    `alias` VARCHAR(140) NOT NULL,  
    PRIMARY KEY (`id`)  
    );

Ahora transferimos los datos de la tabla original usando la consulta SQL:

INSERT INTO `new_table`  
SELECT title, alias FROM `menus`;

Esta misma técnica, la podemos emplear cuando hacemos migraciones de una base de datos MySQL.

Finalmente, se debe renombrar la nueva tabla al nombre original, pero esa acción generará un conflicto con su antigua tabla. Por lo tanto, habrá que renombrarlo o en su defecto eliminarla. Así la consulta SQL podría ser:

DROP TABLE `menus`;  
ALTER TABLE `new_table` RENAME `menus`;

La situación podría ser más compleja, en el caso que la tabla a reordenar tenga claves foráneas o una clave primaria compuesta. Pues MySQL intentará evitar las acciones que quiebren la integridad referencial de la base de datps. Pero el procesimiento es su base será el mismo con algunas consultas SQL adicionales.

Conclusión

Siempre es buena idea agilizar los procesos y minimizar la propención a errores, en las tareas que por su naturaleza sea compleja o poco práctica crear una automatización.

Así, usando sólo:

  • MySQL Workbench, desde donde se gestiona el modelo de datos (diagrama EER).
  • La Terminal MySQL, para acceder al Servidor MySQL.
  • Y un Editor de Textos, que nos sirve para armar las instrucciones SQL.

Podemos, en el modelo de datos de nuestra aplicación abierto en MySQL Workbench, obtener parte de los comandos para efectuar la actualización de la base de datos en desarrollo en forma casi inmediata.

Y por qué no hacemos todo desde MySQL Workbench??

Sólo puedo responder, que me resulta mucho más rápido hacerlo del modo expuesto. Y es definitivamente, mejor que empezar a operar con phpMyAdmin.

Otros enlaces

6 comentarios:

  1. Hola Patricio. Tengo problemas al crear un nuevo campo a una tabla que ya tiene 24 millones de registros. Lo intenté con el Workbench pero me parece que desde la línea de comandos debería ser igual. ¿Qué se puede hacer en este caso?

    ResponderEliminar
  2. Complementando mi consulta, el problema que me ocurre es que el Workbench toma demasiado tiempo en hacer la tarea y termina "colgándose"

    ResponderEliminar
    Respuestas
    1. Carlos, no tengo muy clara cual es tu consulta pero intentaré adivinar. Supongo que tomará menos tiempo de ejecución efectuar una consulta desde una conexión directa al motor de MySQL que usando un programa como Workbench. Recuerdo que algunos programas desarrollados en Java tenían algunas limitaciones a la hora de hacer consultas específicas, puede ser el caso de Workbench. Te recomiendo, si es posible, tomar una o varias porciones acotadas de la tabla y ejecutar desde la terminal tu consulta que crea el nuevo campo para así chequear alguna singularidad dificil de detectar o conseguir una mejor idea del tiempo de procesamiento de la consulta sobre la tabla completa.

      Eliminar