Para explorar las distintas funciones de manipulación de tablas en MySQL, primero se configura un entorno de pruebas.
mysql> CREATE DATABASE base_pruebas;
Query OK, 1 row affected (0.00 sec)
mysql> USE base_pruebas;
Database changed
mysql> CREATE TABLE tabla_personal (identificador INT(8) NOT NULL AUTO_INCREMENT PRIMARY KEY, nombre_completo VARCHAR(50), anios_experiencia TINYINT UNSIGNED);
Query OK, 0 rows affected (0.05 sec)
Inspeccionar la estructura de una tabla
MySQL ofrece múltiples formas para obtener la definición de una tabla. Si la tabla pertenece a otra base de datos, se debe prfeijar con el nombre de la misma (base_datos.nombre_tabla). El comando DESCRIBE es el más común.
mysql> DESCRIBE tabla_personal;
+---------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+----------------+
| identificador | int(8) | NO | PRI | NULL | auto_increment |
| nombre_completo | varchar(50) | YES | | NULL | |
| anios_experiencia | tinyint(3) unsigned | YES | | NULL | |
+---------------------+---------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
mysql> SHOW COLUMNS FROM tabla_personal;
+---------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+----------------+
| identificador | int(8) | NO | PRI | NULL | auto_increment |
| nombre_completo | varchar(50) | YES | | NULL | |
| anios_experiencia | tinyint(3) unsigned | YES | | NULL | |
+---------------------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
Cambiar el nombre de una tabla
Se utiliza la santencia ALTER TABLE ... RENAME. La referencia completa (base_datos.tabla) es necesaria si no se está trabajando en la base de datos activa.
mysql> ALTER TABLE tabla_personal RENAME empleados;
Query OK, 0 rows affected (0.04 sec)
mysql> SHOW TABLES;
+------------------------+
| Tables_in_base_pruebas |
+------------------------+
| empleados |
+------------------------+
1 row in set (0.00 sec)
Modificar únicamente el tipo de dato de una columna
El comando ALTER TABLE ... MODIFY permite cambiar la definición de un campo. Se debe actuar con cautela si la tabla ya contiene registros, ya que podría causar pérdida de datos o errrores.
mysql> DESCRIBE empleados;
+---------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+----------------+
| identificador | int(8) | NO | PRI | NULL | auto_increment |
| nombre_completo | varchar(50) | YES | | NULL | |
| anios_experiencia | tinyint(3) unsigned | YES | | NULL | |
+---------------------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> ALTER TABLE empleados MODIFY nombre_completo CHAR(55) NOT NULL;
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESCRIBE empleados;
+---------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+----------------+
| identificador | int(8) | NO | PRI | NULL | auto_increment |
| nombre_completo | char(55) | NO | | NULL | |
| anios_experiencia | tinyint(3) unsigned | YES | | NULL | |
+---------------------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
Renombrar y alterar el tipo de una columna simultáneamente
ALTER TABLE ... CHANGE permite ambas operaciones en una sola sentencia. Para renombrar sin alterar el tipo, se debe repetir la definición original del tipo de dato.
mysql> DESCRIBE empleados;
+---------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+----------------+
| identificador | int(8) | NO | PRI | NULL | auto_increment |
| nombre_completo | char(55) | NO | | NULL | |
| anios_experiencia | tinyint(3) unsigned | YES | | NULL | |
+---------------------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> ALTER TABLE empleados CHANGE nombre_completo apellidos_nombre VARCHAR(100) NOT NULL;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESCRIBE empleados;
+---------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+----------------+
| identificador | int(8) | NO | PRI | NULL | auto_increment |
| apellidos_nombre | varchar(100) | NO | | NULL | |
| anios_experiencia | tinyint(3) unsigned | YES | | NULL | |
+---------------------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
Agregar una nueva columna
La sintaxis es ALTER TABLE ... ADD. La nueva columna se añadirá por defecto al final de la lista de campos.
mysql> DESCRIBE empleados;
+---------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+----------------+
| identificador | int(8) | NO | PRI | NULL | auto_increment |
| apellidos_nombre | varchar(100) | NO | | NULL | |
| anios_experiencia | tinyint(3) unsigned | YES | | NULL | |
+---------------------+---------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
mysql> ALTER TABLE empleados ADD departamento VARCHAR(30);
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESCRIBE empleados;
+---------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+----------------+
| identificador | int(8) | NO | PRI | NULL | auto_increment |
| apellidos_nombre | varchar(100) | NO | | NULL | |
| anios_experiencia | tinyint(3) unsigned | YES | | NULL | |
| departamento | varchar(30) | YES | | NULL | |
+---------------------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
Insertar una columna en una posición específica
Para colocar un campo al inicio, se usa la cláusula FIRST. Para situarlo después de otro campo existente, se utiliza AFTER.
mysql> DESCRIBE empleados;
+---------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+----------------+
| identificador | int(8) | NO | PRI | NULL | auto_increment |
| apellidos_nombre | varchar(100) | NO | | NULL | |
| anios_experiencia | tinyint(3) unsigned | YES | | NULL | |
| departamento | varchar(30) | YES | | NULL | |
+---------------------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> ALTER TABLE empleados ADD genero ENUM('H','M') FIRST;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE empleados ADD salario_base DECIMAL(10,2) AFTER identificador;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESCRIBE empleados;
+---------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+----------------+
| genero | enum('H','M') | YES | | NULL | |
| identificador | int(8) | NO | PRI | NULL | auto_increment |
| salario_base | decimal(10,2) | YES | | NULL | |
| apellidos_nombre | varchar(100) | NO | | NULL | |
| anios_experiencia | tinyint(3) unsigned | YES | | NULL | |
| departamento | varchar(30) | YES | | NULL | |
+---------------------+---------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
Eliminar una columna de la tabla
La operación se ejecuta con ALTER TABLE ... DROP COLUMN o simplemente DROP. Esta acción es irreversible.
mysql> DESCRIBE empleados;
+---------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+----------------+
| genero | enum('H','M') | YES | | NULL | |
| identificador | int(8) | NO | PRI | NULL | auto_increment |
| salario_base | decimal(10,2) | YES | | NULL | |
| apellidos_nombre | varchar(100) | NO | | NULL | |
| anios_experiencia | tinyint(3) unsigned | YES | | NULL | |
| departamento | varchar(30) | YES | | NULL | |
+---------------------+---------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
mysql> ALTER TABLE empleados DROP COLUMN genero;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESCRIBE empleados;
+---------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+----------------+
| identificador | int(8) | NO | PRI | NULL | auto_increment |
| salario_base | decimal(10,2) | YES | | NULL | |
| apellidos_nombre | varchar(100) | NO | | NULL | |
| anios_experiencia | tinyint(3) unsigned | YES | | NULL | |
| departamento | varchar(30) | YES | | NULL | |
+---------------------+---------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)