Cómo renombrar una tabla usando la sentencia RENAME TABLE de MySQL

Resumen: en este tutorial, aprenderá a renombrar tablas usando la sentencia RENAME TABLE de MySQL y la sentencia ALTER TABLE.

Introducción a la sentencia RENAME TABLE de MySQL

Debido a que los requerimientos del negocio cambian, necesitamos renombrar la tabla actual a una nueva para reflejar mejor la nueva situación. MySQL nos proporciona una sentencia muy útil que cambia el nombre de una o varias tablas.

Para cambiar una o varias tablas, utilizamos la sentencia RENAME TABLE de la siguiente manera:

RENAME TABLE old_table_name TO new_table_name;
Code language: SQL (Structured Query Language) (sql)

La tabla antigua ( old_table_name) debe existir, y la nueva tabla ( new_table_name) no. Si la nueva tabla new_table_name sí existe, la sentencia fallará.

Además de las tablas, podemos utilizar la sentencia RENAME TABLE para renombrar vistas.

Antes de ejecutar la sentencia RENAME TABLE, debemos asegurarnos de que no hay transacciones activas ni tablas bloqueadas.

Tenga en cuenta que no puede utilizar la sentencia RENAME TABLE para cambiar el nombre de una tabla temporal, pero sí puede utilizar la sentencia ALTER TABLE para cambiar el nombre de una tabla temporal.

En términos de seguridad, cualquier privilegio existente que hayamos concedido a la tabla antigua debe ser migrado manualmente a la nueva tabla.

Antes de cambiar el nombre de una tabla, debe evaluar el impacto a fondo. Por ejemplo, debe investigar qué aplicaciones utilizan la tabla. Si el nombre de la tabla cambia, entonces el código de la aplicación que hace referencia al nombre de la tabla debe cambiarse también. Además, debe ajustar manualmente otros objetos de la base de datos, como las vistas, los procedimientos almacenados, los disparadores, las restricciones de clave externa, etc., que hacen referencia a la tabla. Hablaremos de esto con más detalle en los siguientes ejemplos.

Ejemplos de RENAME TABLE de MySQL

Primero, creamos una nueva base de datos llamada hr que consta de dos tablas: employees y departments para la demostración.

Base de datos de muestra
CREATE DATABASE IF NOT EXISTS hr;
Code language: SQL (Structured Query Language) (sql)
CREATE TABLE departments ( department_id INT AUTO_INCREMENT PRIMARY KEY, dept_name VARCHAR(100));CREATE TABLE employees ( id int AUTO_INCREMENT primary key, first_name varchar(50) not null, last_name varchar(50) not null, department_id int not null, FOREIGN KEY (department_id) REFERENCES departments (department_id));
Code language: SQL (Structured Query Language) (sql)

Segundo, insertamos datos de muestra en ambas tablas employees y departments:

Code language: SQL (Structured Query Language) (sql)
INSERT INTO employees(first_name,last_name,department_id) VALUES('John','Doe',1),('Bush','Lily',2),('David','Dave',3),('Mary','Jane',4),('Jonatha','Josh',5),('Mateo','More',1);
Code language: SQL (Structured Query Language) (sql)

En tercer lugar, revisamos nuestros datos en las tablas departments y employees:

SELECT department_id, dept_nameFROM departments;
Code language: SQL (Structured Query Language) (sql)
MySQL RENAME TABLE departamentos Tabla
SELECT id, first_name, last_name, department_idFROM employees;
Code language: SQL (Structured Query Language) (sql)
MySQL RENOMBRAR TABLA tabla empleados

Renombrar una tabla referenciada por una vista

Si la tabla que vas a renombrar está referenciada por una vista, la vista dejará de ser válida si renombras la tabla, y tendrás que ajustar la vista manualmente.

Por ejemplo, creamos una vista llamada v_employee_info basada en las tablas employees y departments como sigue:

CREATE VIEW v_employee_info as SELECT id, first_name, last_name, dept_name from employees inner join departments USING (department_id);
Code language: SQL (Structured Query Language) (sql)

Las vistas utilizan la cláusula inner join para unir las tablas departments y employees.

La siguiente sentencia SELECT devuelve todos los datos de la vista v_employee_info.

SELECT *FROM v_employee_info;
Code language: SQL (Structured Query Language) (sql)
MySQL RENAME TABLE with View example

Ahora renombramos la employees a people tabla y consultamos los datos de la v_employee_info vista de nuevo.

RENAME TABLE employees TO people;
Code language: SQL (Structured Query Language) (sql)
SELECT *FROM v_employee_info;
Code language: SQL (Structured Query Language) (sql)

MySQL devuelve el siguiente mensaje de error:

Error Code: 1356. View 'hr.v_employee_info' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
Code language: SQL (Structured Query Language) (sql)

Podemos utilizar la sentencia CHECK TABLE para comprobar el estado de la vista v_employee_info de la siguiente manera:

CHECK TABLE v_employee_info;
Code language: SQL (Structured Query Language) (sql)
MySQL CHECK TABLE

Necesitamos manualmente cambiar la vista v_employee_info para que haga referencia a la tabla people en lugar de la tabla employees.

Renombrar una tabla referenciada por un procedimiento almacenado

En caso de que la tabla que vas a renombrar esté referenciada por un procedimiento almacenado, tienes que ajustarla manualmente como hiciste con la vista.

Primero, renombra la tabla people de nuevo a la tabla employees.

RENAME TABLE people TO employees;
Code language: SQL (Structured Query Language) (sql)

Entonces, crea un nuevo procedimiento almacenado llamado get_employee que haga referencia a la tabla employees.

DELIMITER $$CREATE PROCEDURE get_employee(IN p_id INT)BEGINSELECT first_name,last_name,dept_nameFROM employeesINNER JOIN departments using (department_id)WHERE id = p_id;END $$DELIMITER;
Code language: SQL (Structured Query Language) (sql)

A continuación, ejecutamos la tabla get_employee para obtener los datos del empleado con id 1 de la siguiente manera:

CALL get_employee(1);
Code language: SQL (Structured Query Language) (sql)
MySQL RENAME TABLE with Stored Procedure

Después, renombramos la employees a la tabla people de nuevo.

RENAME TABLE employees TO people;
Code language: SQL (Structured Query Language) (sql)

Por último, llamamos al procedimiento almacenado get_employee para obtener la información del empleado con id 2:

CALL get_employee(2);
Code language: SQL (Structured Query Language) (sql)

MySQL devuelve el siguiente mensaje de error:

Error Code: 1146. Table 'hr.employees' doesn't exist
Code language: SQL (Structured Query Language) (sql)

Para solucionarlo, debemos cambiar manualmente la tabla employees del procedimiento almacenado por la tabla people.

Renombrar una tabla que tiene claves foráneas referenciadas

La tabla departments se enlaza con la tabla employees utilizando la columna department_id. La columna department_id de la tabla employees es la clave foránea que hace referencia a la tabla departments.

Si renombramos la tabla departments, todas las claves foráneas que apuntan a la tabla departments no se actualizarán automáticamente. En estos casos, debemos eliminar y volver a crear las claves foráneas manualmente.

RENAME TABLE departments TO depts;
Code language: SQL (Structured Query Language) (sql)

Borramos un departamento con id 1, debido a la restricción de clave foránea, todas las filas de la tabla people también deberían eliminarse. Sin embargo, renombramos la tabla departments a la tabla depts sin actualizar la clave foránea manualmente, MySQL devuelve un error como se ilustra a continuación:

DELETE FROM depts WHERE department_id = 1;
Code language: SQL (Structured Query Language) (sql)
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`hr`.`people`, CONSTRAINT `people_ibfk_1` FOREIGN KEY (`department_id`) REFERENCES `depts` (`department_id`))
Code language: SQL (Structured Query Language) (sql)

Renombrar múltiples tablas

También podemos utilizar la sentencia RENAME TABLE para renombrar múltiples tablas a la vez. Vea la siguiente sentencia:

RENAME TABLE old_table_name_1 TO new_table_name_2, old_table_name_2 TO new_table_name_2,...
Code language: SQL (Structured Query Language) (sql)

La siguiente sentencia renombra las tablas people y depts a employees y departments:

RENAME TABLE depts TO departments, people TO employees;
Code language: SQL (Structured Query Language) (sql)

Nota que la sentencia RENAME TABLE no es atómica. Significa que si se produce algún error, MySQL hace un rollback de todas las tablas renombradas a sus antiguos nombres.

Renombrar tablas usando la sentencia ALTER TABLE

Podemos renombrar una tabla usando la sentencia ALTER TABLE de la siguiente manera:

ALTER TABLE old_table_nameRENAME TO new_table_name;
Code language: SQL (Structured Query Language) (sql)

La sentencia ALTER TABLE puede renombrar una tabla temporal mientras que la sentencia RENAME TABLE no.

Ejemplo de renombramiento de tabla temporal

Primero, creamos una tabla temporal que contiene todos los apellidos únicos que provienen de la columna last_name de la tabla employees:

CREATE TEMPORARY TABLE lastnamesSELECT DISTINCT last_name from employees;
Code language: SQL (Structured Query Language) (sql)

En segundo lugar, utilizamos el RENAME TABLE para renombrar la tabla lastnames:

RENAME TABLE lastnames TO unique_lastnames;
Code language: SQL (Structured Query Language) (sql)

MySQL devuelve el siguiente mensaje de error:

Error Code: 1017. Can't find file: '.\hr\lastnames.frm' (errno: 2 - No such file or directory)
Code language: SQL (Structured Query Language) (sql)

En tercer lugar, utilizamos la sentencia ALTER TABLE para renombrar la tabla lastnames.

ALTER TABLE lastnamesRENAME TO unique_lastnames;
Code language: SQL (Structured Query Language) (sql)

En cuarto lugar, consultamos los datos de la tabla temporal unique_lastnames:

SELECT last_nameFROM unique_lastnames;
Code language: SQL (Structured Query Language) (sql)
MySQL ALTER TABLE cambia el nombre de la tabla temporal

En este tutorial, hemos mostrado cómo cambiar el nombre de las tablas utilizando las sentencias MySQL RENAME TABLE y ALTER TABLE.

  • ¿Ha sido útil este tutorial?
  • SíNo

Se puede decir que es útil.