¿La forma más rápida de copiar una tabla en mysql?

82

Quiero copiar una tabla en MySQL. ¿Cuál es la forma más rápida? ¿Me gusta esto?

CREATE TABLE copy LIKE original;
INSERT INTO copy SELECT * FROM original;

o

CREATE TABLE copy SELECT * FROM original;
ALTER TABLE copy ADD PRIMARY KEY (id);

¿O hay otra manera?

EDITAR: Me preocupa que se vuelvan a crear los índices, ¿cómo procede mysql a ejecutar estas declaraciones?

PD. no puede usar herramientas de línea de comandos como mysqldump, debe estar sobre la marcha.

Luego
fuente

Respuestas:

50

Esto copia la estructura de la tabla inmediatamente, pero no los datos:

CREATE TABLE copy LIKE original;

Esto crea todos los índices que originaltenía la tabla.

Funciona de esta manera en mysql 5.1.39.

ceteras
fuente
3
Pero no copiará los activadores.
ursitesion
3
Tenga en cuenta que esto tampoco copiará las restricciones de claves externas.
Omer Sabic
47

La forma más rápida de usar tablas MyISAM conservando los índices ) y quizás otros motores de almacenamiento es:

CREATE TABLE copy LIKE original;
ALTER TABLE copy DISABLE KEYS;
INSERT INTO copy SELECT * FROM original;
ALTER TABLE copy ENABLE KEYS;

Desea deshabilitar sus claves para la carga de su base de datos y luego volver a crear las claves al final.

Del mismo modo, para InnoDB :

SET unique_checks=0; SET foreign_key_checks=0; 
..insert sql code here..
SET unique_checks=1; SET foreign_key_checks=1;

(Como se señaló en los comentarios).

ctbrown
fuente
1
Extraño. INSERT con teclas tomó 36 min, y este método tomó 10 + 26 min (insertar + alterar). 6 índices, 28 M registros, Win 7 x64, 8GB RAM.
Per Lindberg
Un ENABLE KEYS causa una "tabla de reparación". Verifique su lista de procesos de qué manera sucede esto. Hay dos tipos de: 1. tabla de reparación con keycache 2. tabla de reparación ordenando La segunda si es rápida y solo se usará si myisam_max_sort_file_size es lo suficientemente grande. dev.mysql.com/doc/refman/5.7/en/repair-table-speed.html
Lopo
ALTER TABLE table DISABLE/ENABLE KEYSno funciona en InnoDB y da la siguiente advertencia Table storage engine for 'table' doesn't have this option.
Amil Waduwawara
1
para innodb use SET unique_checks=0; SET foreign_key_checks=0;inserte el código sql aquíSET unique_checks=1; SET foreign_key_checks=1;
tuku
13

Del manual :

"CREATE TABLE ... SELECT no crea automáticamente ningún índice por ti. Esto se hace intencionalmente para que la declaración sea lo más flexible posible. Si quieres tener índices en la tabla creada, debes especificarlos antes de la declaración SELECT:"

CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;

Puede especificar índices y tipos de datos (para evitar la conversión de tipos de datos) en ambos CREATE TABLE LIKEy CREATE TABLE SELECT. Cuál es más rápido dependerá de su configuración.

dnagirl
fuente
9

Para copiar con índices y activadores, haga estas 2 consultas:

CREATE TABLE newtable LIKE oldtable; 
INSERT newtable SELECT * FROM oldtable;

Para copiar solo la estructura y los datos, use este:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
Zigri2612
fuente
¿No debería ser en INSERT INTOlugar de INSERT?
giordano
6

¿ create table mynewtable (select * from myoldtable)Funciona en mysql? Si es así, puedes probarlo también.

Draco Ater
fuente
5

La mejor manera de copiar la estructura y todas las entradas de una tabla a otra (creando una nueva tabla) es esta consulta ...

CREATE TABLE new_table LIKE old_table; INSERT new_table SELECT * FROM old_table;

Anil Chahal
fuente
3

Prueba SELECT INTOy usa una variable como intermediario.

Primero, deberá crear la tabla receptora para que tenga la misma estructura que la tabla fuente.

Lo mejor es que es interno, por lo que es rápido. Sin embargo, perderá sus índices.

anfetamáquina
fuente
Seleccionar en no es compatible con mySQL
Draco Ater
@Draco Ater - Sí, lo hace. Solo usa variables.
amphetamachine
2
¿Puede dar un ejemplo? Porque creo que las variables solo mantendrán el último valor leído por la selección, pero no todos los valores en la tabla. Siempre que no use un cursor y no quiera copiar tablas con más de una fila, esta solución no funciona en absoluto.
fancyPants
2

si está utilizando MyISAM, también puede copiar y cambiar el nombre de los archivos induviduales. Archivos .MYD, .MYI, .FRM en el backend

Aravind
fuente
1

Tal vez podrías echarle un vistazo SHOW CREATE TABLE .

Pasos a seguir:

  • Ir a phpmyadmin

  • Ir a SQL

Ejecuta esta consulta

SHOW CREATE TABLE `the_old_table`;
  • Haga clic en opciones Marque "Textos completos" y presione Ir.

El resultado es una declaración CREATE TABLE completa. Edite la consulta hasta que esté satisfecho.

Recurso: http://dev.mysql.com/doc/refman/5.7/en/show-create-table.html

Julian
fuente
0
CREATE TABLE copy SELECT * FROM original;

Es una forma rápida, pero tal vez no sea la causa más rápida de índices.

Thor
fuente
Edite su respuesta y formatéela correctamente para que sea legible.
Neeku
1
Esta declaración no copia índices ni activadores asociados con esta tabla.
ursitesion