En MySQL, ¿cómo copiar el contenido de una tabla a otra tabla dentro de la misma base de datos?

118

Soy nuevo en MySQL. Me gustaría copiar el contenido de una tabla a otra tabla dentro de la misma base de datos. Básicamente, me gustaría insertar en una tabla desde otra tabla. ¿Existe una forma fácil de hacer esto?

Joneph O.
fuente

Respuestas:

184

INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

EDITAR: o si las tablas tienen diferentes estructuras también puede:

INSERT INTO TARGET_TABLE (`col1`,`col2`) SELECT `col1`,`col2` FROM SOURCE_TABLE;

EDITAR: para restringir esto ...

INSERT INTO TARGET_TABLE (`col1_`,`col2_`) SELECT `col1`,`col2` FROM SOURCE_TABLE WHERE `foo`=1
ggiroux
fuente
¿Qué sucederá si alguien quiere realizar operaciones de inserción en la tabla fuente durante la ejecución de esta consulta? bloquea la operación de inserción o no?
Lawakush Kurmi
135

Si la tabla no existe, puede crear una con el mismo esquema así:

CREATE TABLE table2 LIKE table1;

Luego, para copiar los datos:

INSERT INTO table2 SELECT * FROM table1
GSto
fuente
1
Encontré este código SELECT * INTO newTable FROM sourceTableen w3school , por qué no funciona enMySQL
Kasun Siyambalapitiya
@KasunSiyambalapitiya SELECT ... INTOestá destinado a exportar una tabla a un archivo de salida o variables; no directamente en una mesa. Ver dev.mysql.com/doc/refman/5.7/en/select-into.html
Doktor J
@Kasun Siyambalapitiya que la página de w3school es para un SQL diferente, no para MySQL. w3schools ahora tiene informes de errores, si encuentra problemas, infórmelo en su sitio para ayudarlo con el conocimiento preciso.
Nightwolf
27

Si table1 es grande y no desea bloquearlo durante el proceso de copia, puede realizar un volcado y carga en su lugar:

CREATE TABLE table2 LIKE table1;

SELECT * INTO OUTFILE '/tmp/table1.txt' FROM table1;
LOAD DATA INFILE '/tmp/table1.txt' INTO TABLE table2;
Ike Walker
fuente
Intenté descargar en un RDS, usando la solución stackoverflow.com/a/9536680/351903 . El archivo se creó pero permaneció en tamaño 0 durante mucho tiempo. Además, al verificar show processlist, no pude ver ninguna consulta en ejecución. No estoy seguro de cuál es el problema.
Sandeepan Nath
15

Esto funcionó para mí

CREATE TABLE newtable LIKE oldtable;

Replica mesa nueva con mesa antigua

INSERT newtable SELECT * FROM oldtable;

Copia todos los datos de la fila en una nueva tabla.

Gracias

Jason
fuente
10

Si desea crear y copiar el contenido en una sola toma, simplemente use SELECT:

CREAR TABLA new_tbl SELECT * FROM orig_tbl;

Frank Heikens
fuente
4
+1, aunque la nueva tabla no tendrá las definiciones de índice de la primera. El enfoque "crear ... como ..." también copiará las definiciones de índice.
Martin
2

Esto funcionó para mí. Puede hacer que la instrucción SELECT sea más compleja, con cláusulas WHERE y LIMIT.

Primero duplique su tabla grande (sin los datos), ejecute la siguiente consulta y luego trunque la tabla más grande.

INSERT INTO table_small (SELECT * FROM table_large WHERE column = 'value' LIMIT 100)

Super simple. :-)

Sandor Fekete
fuente
0
CREATE TABLE target_table SELECT * FROM source_table;

Simplemente crea una nueva tabla con la misma estructura que la tabla de origen y también copia todas las filas de source_table en target_table.

CREATE TABLE target_table SELECT * FROM source_table WHERE condition;

Si necesita copiar algunas filas en target_table, aplique una condición dentro de la cláusula where

CelinVeronicca
fuente