Copiar una tabla

Copiar una tabla en MySQL es útil para crear backups rápidos antes de hacer cambios arriesgados, generar tablas de prueba con datos reales, o crear tablas temporales para procesamiento. Hay varias formas de hacerlo, cada una con sus particularidades respecto a qué se copia y qué no.

Copiar estructura y datos con CREATE TABLE ... SELECT

La forma más rápida de copiar una tabla es:

CREATE TABLE productos_copia AS
SELECT * FROM productos;

Esta sentencia crea una nueva tabla con la misma estructura de columnas y copia todos los datos. Sin embargo, tiene una limitación importante: no copia los índices, las foreign keys, los triggers ni los valores por defecto de las columnas. La nueva tabla solo tiene las columnas con sus tipos de datos.

-- Verificar qué se copió
SHOW CREATE TABLE productos_copia\G

Verás que la tabla resultante no tiene PRIMARY KEY ni índices secundarios.

Copiar solo la estructura con CREATE TABLE ... LIKE

Para copiar la estructura completa incluyendo índices y restricciones:

CREATE TABLE productos_backup LIKE productos;

Esta sentencia crea una tabla vacía con exactamente la misma estructura que la original: columnas, tipos de datos, PRIMARY KEY, índices, valores por defecto y opciones AUTO_INCREMENT. No copia los datos ni los triggers.

Para agregar los datos después:

INSERT INTO productos_backup
SELECT * FROM productos;

Este enfoque en dos pasos es el más completo porque preserva toda la estructura de la tabla original.

Copiar estructura, datos e índices (método completo)

El método LIKE + INSERT es el más recomendado:

-- Paso 1: Copiar estructura completa
CREATE TABLE pedidos_backup LIKE pedidos;
 
-- Paso 2: Copiar los datos
INSERT INTO pedidos_backup SELECT * FROM pedidos;
 
-- Verificar
SELECT COUNT(*) AS filas_original FROM pedidos;
SELECT COUNT(*) AS filas_copia FROM pedidos_backup;
filas_original
28450
filas_copia
28450

Copiar solo algunos datos

Puedes filtrar los datos que copias añadiendo condiciones:

CREATE TABLE pedidos_enero LIKE pedidos;
 
INSERT INTO pedidos_enero
SELECT * FROM pedidos
WHERE fecha_pedido >= '2026-01-01'
AND fecha_pedido < '2026-02-01';

O con CREATE TABLE ... SELECT si no necesitas los índices:

CREATE TABLE clientes_madrid AS
SELECT * FROM clientes
WHERE ciudad = 'Madrid';

Copiar solo algunas columnas

CREATE TABLE catalogo_precios AS
SELECT id, nombre, precio, stock
FROM productos
WHERE activo = 1;

La tabla resultante solo tendrá las cuatro columnas seleccionadas.

Copiar a otra base de datos

Para copiar una tabla entre bases de datos del mismo servidor:

-- Copiar estructura
CREATE TABLE staging.productos LIKE produccion.productos;
 
-- Copiar datos
INSERT INTO staging.productos
SELECT * FROM produccion.productos;

Diferencias entre los métodos

CaracterísticaCREATE ... SELECTCREATE ... LIKE + INSERT
Columnas y tiposSiSi
DatosSiSi (con INSERT)
PRIMARY KEYNoSi
Índices secundariosNoSi
AUTO_INCREMENTNoSi
Foreign keysNoNo
TriggersNoNo
Valores por defectoNoSi

Ninguno de los dos métodos copia foreign keys ni triggers. Si los necesitas, debes crearlos manualmente o usar mysqldump para exportar la tabla completa.

Copiar incluyendo foreign keys y triggers

Para una copia absolutamente completa, usa mysqldump:

# Exportar la tabla con toda su definición
mysqldump --single-transaction -u root -p tienda_mysql productos > productos_dump.sql
 
# Editar el archivo para cambiar el nombre de la tabla
sed -i 's/`productos`/`productos_backup`/g' productos_dump.sql
 
# Importar
mysql -u root -p tienda_mysql < productos_dump.sql

Copia rápida para backup antes de cambios

Un patrón común es crear un backup rápido antes de ejecutar un ALTER TABLE o UPDATE masivo:

-- Backup rápido antes de un cambio arriesgado
CREATE TABLE productos_pre_cambio LIKE productos;
INSERT INTO productos_pre_cambio SELECT * FROM productos;
 
-- Hacer el cambio
UPDATE productos SET precio = precio * 1.10 WHERE categoria_id = 6;
 
-- Si algo sale mal, restaurar
-- TRUNCATE productos;
-- INSERT INTO productos SELECT * FROM productos_pre_cambio;
 
-- Si todo salió bien, limpiar
DROP TABLE productos_pre_cambio;

Rendimiento en tablas grandes

Para tablas con millones de filas, la operación INSERT INTO ... SELECT puede tardar un tiempo considerable. Desactivar temporalmente las verificaciones acelera el proceso:

SET foreign_key_checks = 0;
SET unique_checks = 0;
 
CREATE TABLE log_copia LIKE log_actividad;
INSERT INTO log_copia SELECT * FROM log_actividad;
 
SET foreign_key_checks = 1;
SET unique_checks = 1;

Copiar tablas es una operación básica pero fundamental en la administración de MySQL. El método CREATE TABLE ... LIKE seguido de INSERT INTO ... SELECT es la combinación más segura y completa para la mayoría de los escenarios.

Escrito por Eduardo Lázaro