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?

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

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

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;

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


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;


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. :-)


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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.