No MySQL, como copiar o conteúdo de uma tabela para outra tabela no mesmo banco de dados?

118

Eu sou novo no MySQL. Eu gostaria de copiar o conteúdo de uma tabela para outra tabela no mesmo banco de dados. Basicamente, gostaria de inserir em uma tabela de outra tabela. Existe uma maneira fácil de fazer isso?

Joneph O.
fonte

Respostas:

184

INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

EDITAR: ou se as tabelas tiverem estruturas diferentes, você também pode:

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

EDITAR: para restringir isso ..

INSERT INTO TARGET_TABLE (`col1_`,`col2_`) SELECT `col1`,`col2` FROM SOURCE_TABLE WHERE `foo`=1
ggiroux
fonte
O que acontecerá se alguém quiser realizar operações de inserção na tabela de origem durante a execução desta consulta? bloqueia a operação de inserção ou não?
Lawakush Kurmi
135

Se a tabela não existir, você pode criar uma com o mesmo esquema da seguinte maneira:

CREATE TABLE table2 LIKE table1;

Então, para copiar os dados:

INSERT INTO table2 SELECT * FROM table1
GSto
fonte
1
Encontrei este código SELECT * INTO newTable FROM sourceTableno w3school , por que ele não está funcionandoMySQL
Kasun Siyambalapitiya
@KasunSiyambalapitiya SELECT ... INTOserve para exportar uma tabela para um arquivo de saída ou para variáveis; não diretamente em uma mesa. Consulte dev.mysql.com/doc/refman/5.7/en/select-into.html
Doktor J
@Kasun Siyambalapitiya que a página w3school é para um SQL diferente, não destinado ao MySQL. w3schools agora tem relatórios de erros, se você encontrar problemas, relate-os em seu site para ajudar com um conhecimento preciso.
Nightwolf de
27

Se a tabela1 for grande e você não quiser bloqueá-la durante o processo de cópia, você pode fazer um dump-and-load em vez disso:

CREATE TABLE table2 LIKE table1;

SELECT * INTO OUTFILE '/tmp/table1.txt' FROM table1;
LOAD DATA INFILE '/tmp/table1.txt' INTO TABLE table2;
Ike Walker
fonte
Tentei despejar em um RDS, usando a solução stackoverflow.com/a/9536680/351903 . O arquivo foi criado, mas permaneceu com o tamanho 0 por muito tempo. Além disso, ao verificar show processlist, não consegui ver nenhuma consulta em execução. Não tenho certeza de qual é o problema.
Sandeepan Nath
15

Isso funcionou para mim,

CREATE TABLE newtable LIKE oldtable;

Replica a nova tabela com a tabela antiga

INSERT newtable SELECT * FROM oldtable;

Copia todos os dados da linha para a nova tabela.

Obrigado

Jason
fonte
10

Se você deseja criar e copiar o conteúdo em uma única cena, basta usar o SELECT:

CREATE TABLE new_tbl SELECT * FROM orig_tbl;

Frank Heikens
fonte
4
+1 - embora a nova tabela não tenha as definições de índice da primeira. A abordagem "criar ... como ..." copiará as definições de índice também.
Martin
2

Isso funcionou para mim. Você pode tornar a instrução SELECT mais complexa, com cláusulas WHERE e LIMIT.

Primeiro duplique sua tabela grande (sem os dados), execute a consulta a seguir e trunque a tabela maior.

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

Super simples. :-)

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

Ele apenas cria uma nova tabela com a mesma estrutura da tabela de origem e também copia todas as linhas de source_table para target_table.

CREATE TABLE target_table SELECT * FROM source_table WHERE condition;

Se você precisar que algumas linhas sejam copiadas para target_table, aplique uma condição dentro da cláusula where

CelinVeronicca
fonte
-3

Experimente isso. Funciona bem no meu Oracle 10g,

CREATE TABLE new_table
  AS (SELECT * FROM old_table);
RAHUL KUMAR
fonte
8
Mas a questão é sobre o MySQL.
Salman A de
Deu + para isso, porque funciona com MySQL também. dev.mysql.com/doc/refman/5.7/en/create-table-select.html
Daniel