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\GVerá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ística | CREATE ... SELECT | CREATE ... LIKE + INSERT |
|---|---|---|
| Columnas y tipos | Si | Si |
| Datos | Si | Si (con INSERT) |
| PRIMARY KEY | No | Si |
| Índices secundarios | No | Si |
| AUTO_INCREMENT | No | Si |
| Foreign keys | No | No |
| Triggers | No | No |
| Valores por defecto | No | Si |
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.sqlCopia 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
