RENAME TABLE

La sentencia RENAME TABLE cambia el nombre de una o más tablas. Es una operación atómica: si renombras varias tablas en una sentencia y alguna falla, ninguna se renombra. MySQL actualiza automáticamente las claves foráneas que referencian la tabla renombrada.

Sintaxis

RENAME TABLE nombre_actual TO nombre_nuevo;

También puedes usar ALTER TABLE:

ALTER TABLE nombre_actual RENAME TO nombre_nuevo;

Ambas formas son equivalentes. La diferencia es que RENAME TABLE permite renombrar varias tablas en una sola sentencia.

Renombrar una tabla

CREATE TABLE tareas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    titulo VARCHAR(200) NOT NULL,
    completada BOOLEAN DEFAULT FALSE
);
 
INSERT INTO tareas (titulo) VALUES ('Revisar código'), ('Escribir tests');
RENAME TABLE tareas TO actividades;
Query OK, 0 rows affected (0.02 sec)

La tabla tareas ya no existe. Ahora se llama actividades:

SELECT * FROM actividades;
idtitulocompletada
1Revisar código0
2Escribir tests0

Si intentas consultar el nombre antiguo:

SELECT * FROM tareas;
ERROR 1146 (42S02): Table 'tienda_mysql.tareas' doesn't exist

Renombrar múltiples tablas

RENAME TABLE puede renombrar varias tablas a la vez:

CREATE TABLE usuarios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL
);
 
CREATE TABLE permisos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT,
    permiso VARCHAR(50)
);
RENAME TABLE
    usuarios TO cuentas,
    permisos TO autorizaciones;
Query OK, 0 rows affected (0.03 sec)

Si alguna de las tablas no existe o el nuevo nombre ya está en uso, la operación completa falla y ninguna tabla se renombra. Esta atomicidad es útil cuando necesitas garantizar consistencia.

Intercambiar nombres de tablas

Un caso de uso habitual del renombrado múltiple es intercambiar los nombres de dos tablas. Esto es útil para reemplazar una tabla por su versión actualizada sin tiempo de inactividad:

CREATE TABLE datos_actuales (
    id INT PRIMARY KEY,
    valor VARCHAR(100)
);
 
CREATE TABLE datos_nuevos (
    id INT PRIMARY KEY,
    valor VARCHAR(100)
);
 
INSERT INTO datos_actuales VALUES (1, 'original');
INSERT INTO datos_nuevos VALUES (1, 'actualizado');
RENAME TABLE
    datos_actuales TO datos_backup,
    datos_nuevos TO datos_actuales;

En una sola operación atómica, la tabla antigua pasa a ser el backup y la nueva toma su lugar. Las consultas que acceden a datos_actuales obtienen los datos nuevos sin interrupción.

Mover tablas entre bases de datos

RENAME TABLE permite mover una tabla a otra base de datos usando el nombre cualificado base_de_datos.tabla:

CREATE DATABASE IF NOT EXISTS archivo;
 
RENAME TABLE tienda_mysql.actividades TO archivo.actividades;

La tabla se mueve de tienda_mysql a archivo. Esto es más eficiente que copiar los datos con CREATE TABLE ... SELECT y luego eliminar la original, ya que RENAME no copia datos, solo mueve la referencia.

Para moverla de vuelta:

RENAME TABLE archivo.actividades TO tienda_mysql.actividades;

El movimiento entre bases de datos solo funciona si ambas están en el mismo sistema de archivos.

Claves foráneas y renombrado

Cuando renombras una tabla que es referenciada por claves foráneas de otras tablas, MySQL actualiza automáticamente esas referencias:

CREATE TABLE proyectos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100)
);
 
CREATE TABLE tareas_proyecto (
    id INT AUTO_INCREMENT PRIMARY KEY,
    proyecto_id INT,
    titulo VARCHAR(200),
    FOREIGN KEY (proyecto_id) REFERENCES proyectos(id)
);
RENAME TABLE proyectos TO iniciativas;

La clave foránea en tareas_proyecto ahora apunta a iniciativas(id) automáticamente. Puedes verificarlo:

SHOW CREATE TABLE tareas_proyecto\G

Tablas con triggers

Si una tabla tiene triggers asociados, RENAME TABLE mantiene los triggers. Sin embargo, los triggers están vinculados al nombre de la tabla en el esquema interno. En MySQL 8.0, los triggers se actualizan correctamente al renombrar.

Tablas con vistas

Las vistas que referencian una tabla renombrada no se actualizan automáticamente. Después de renombrar una tabla, las vistas que la usaban devuelven error:

CREATE VIEW vista_actividades AS
SELECT id, titulo FROM actividades;
 
RENAME TABLE actividades TO tareas_pendientes;
 
SELECT * FROM vista_actividades;
ERROR 1356 (HY000): View 'tienda_mysql.vista_actividades' references invalid table(s) or column(s)

Debes actualizar las vistas manualmente después de renombrar tablas. Es recomendable buscar referencias antes del renombrado:

SELECT TABLE_NAME, VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE()
  AND VIEW_DEFINITION LIKE '%actividades%';

Permisos

Para renombrar una tabla necesitas los privilegios ALTER y DROP sobre la tabla original, y CREATE e INSERT sobre la nueva. Si mueves la tabla a otra base de datos, necesitas además los permisos correspondientes en la base de datos destino.

Limpieza

DROP VIEW IF EXISTS vista_actividades;
DROP TABLE IF EXISTS tareas_proyecto;
DROP TABLE IF EXISTS iniciativas;
DROP TABLE IF EXISTS tareas_pendientes;
DROP TABLE IF EXISTS cuentas;
DROP TABLE IF EXISTS autorizaciones;
DROP TABLE IF EXISTS datos_actuales;
DROP TABLE IF EXISTS datos_backup;
DROP DATABASE IF EXISTS archivo;

En el siguiente artículo veremos cómo eliminar tablas con DROP TABLE.

Escrito por Eduardo Lázaro