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. Para copias de bases de datos completas, el artículo sobre copiar una base de datos cubre ese escenario. Hay varias formas de copiar una tabla, 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. Si la tabla tiene muchos registros, puedes acelerar la copia desactivando temporalmente verificaciones con transacciones y luego confirmando los cambios con un COMMIT.
Escrito por Eduardo Lázaro
