2010-05-31 35 views
74

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

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?

EDIT: Me preocupa que los índices se vuelvan a crear, ¿cómo procede mysql a ejecutar estos enunciados?

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

+1

Anon debe seleccionar una respuesta a esta pregunta. – ctbrown

Respuesta

3

Pruebe SELECT INTO, y utilice un variable como intermediario.

Primero tendrá que crear la tabla receptora para tener la misma estructura que la tabla fuente.

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

+0

Seleccionar en no es compatible con mySQL –

+0

@Draco Ater - Sí, lo hace. Solo usa variables. – amphetamachine

+2

¿Puedes dar un ejemplo? Porque creo que las variables solo mantendrán el último valor leído por los valores de selección, pero no todos, en la tabla. Siempre que no utilice un cursor y no desee copiar tablas con más de una fila, esta solución no funcionará en absoluto. – fancyPants

6

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

10

Desde el manual:

"CREATE TABLE ... SELECT no crea automáticamente los índices para usted Se hace a propósito para hacer la declaración tan flexibles como sea posible si usted quiere tener índices en lo creado.. tabla, se debe especificar estos antes de la instrucción SELECT: "

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

puede especificar índices y tipos de datos (para evitar la conversión de tipo de datos) en tanto con CREATE TABLE LIKE y CREATE TABLE SELECT. Cuál es más rápido dependerá de su configuración.

45

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

CREATE TABLE copy LIKE original; 

Esto crea todos los índices de la tabla original tenía.

Funciona de esta forma en mysql 5.1.39.

+1

Pero no copiará los desencadenantes. – ursitesion

+1

Tenga en cuenta que esto tampoco copiará las restricciones de claves externas. –

2

si está utilizando MyISAM también puede copiar y cambiar el nombre de los archivos induvidual. archivos .MYD, .MYI, .FRM en el back-end

36

La forma más rápida utilizando MyISAM mesas mientras preservar índices) y tal vez 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 desactivar su claves para cargar 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 ha señalado en los comentarios.)

+1

Extraño. INSERT con claves tomó 36 min, y este método tardó 10 + 26 min (insertar + alterar). 6 índices, 28 registros M, Win 7 x64, 8GB RAM. –

+0

Las TECLAS DE HABILITACIÓN causan 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 llave de caché 2. tabla de reparación ordenando La segunda si la forma es rápida y solo se usará si myisam_max_sort_file_size es lo suficientemente grande. https://dev.mysql.com/doc/refman/5.7/en/repair-table-speed.html – lopo

+0

tabla 'ALTER TABLE DESABLE/HABILITAR LLAVES' no funciona en InnoDB y da la advertencia siguiente 'Tabla el motor de almacenamiento para 'tabla' no tiene esta opción'. –

0
CREATE TABLE copy SELECT * FROM original; 

Es una forma rápida pero quizás la causa más rápida de los índices.

+0

Por favor, edite su respuesta y formatéela adecuadamente para que sea legible. – Neeku

+0

Esta instrucción no copia los índices ni desencadenadores asociados con esta tabla. – ursitesion

5

mejor manera de copiar la estructura y todas las entradas de una tabla a otra tabla (mediante la creación de la nueva tabla) es esta consulta ...

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

1

tal vez usted podría echar un vistazo a SHOW CREATE TABLE.

Pasos a seguir:

  • Ir a phpMyAdmin

  • Ir a SQL

ejecutar esta consulta

SHOW CREATE TABLE `the_old_table`; 
  • Haz clic en las opciones Marca "Textos completos" y presiona Ir.

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

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

6

Para copiar con índices y disparadores hacen estas 2 preguntas:

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

Para copiar la estructura justa y utilizan datos de éste:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old; 
Cuestiones relacionadas