mysql :: inserir na tabela, dados de outra tabela?

187

Eu queria saber se existe uma maneira de fazer isso puramente em sql:

q1 = SELECT campaign_id, from_number, received_msg, date_received 
     FROM `received_txts` WHERE `campaign_id` = '8';
INSERT INTO action_2_members (campaign_id, mobile, vote, vote_date)    
    VALUES(q1.campaign_id, q1.from_number, q1.received_msg, q1.date_received);

Nota: o q1 retornaria cerca de 30 mil linhas.

Existe alguma maneira de fazer o que estou tentando acima em sql direto? Apenas puxar os dados diretamente de uma tabela (basicamente uma tabela de dados brutos) e inserir em outra tabela (basicamente uma tabela de dados processados)?

Hailwood
fonte

Respostas:

401
INSERT INTO action_2_members (campaign_id, mobile, vote, vote_date)  
SELECT campaign_id, from_number, received_msg, date_received
  FROM `received_txts`
 WHERE `campaign_id` = '8'
zerkms
fonte
1
@InSane: 1) responda 2) corrija a formatação da pergunta. Não perca a ordem próxima vez ;-)
zerkms
ha ha :-) sim ... nunca consegui classificar minhas prioridades! :-D
Jagmag
1
Trabalhando! +1 Perfeito e muito rápido! Obrigado companheiro. Só tive que remover colchetes dos campos SELECT ...
Alguém
@zerkms; Os gatilhos funcionarão com esta INSERT INTO ... SELECTdeclaração?
haccks
2
@haccks Creio que o mesmo como se fosse apenas um "normal"INSERT
zerkms
30

para toda a linha

insira no xyz selecione * de xyz2 onde id = "1";

para a coluna selecionada

insira em xyz (t_id, v_id, nome_do_ f) selecione t_id, v_id, nome_do_f a partir de xyz2 onde id = "1";
Lokesh Deshmukh
fonte
1
A abordagem de linha inteira falha se já houver um registro existente com uma chave primária correspondente.
HotN
Você achou alguma solução? <A abordagem de linha inteira falha se já existe um registro com uma chave primária correspondente.>
Shivdhwaj Pandey
10

Respondida por zerkms é o método correto. Mas, se alguém que deseja inserir mais coluna extra na tabela, poderá obtê-lo do seguinte:

INSERT INTO action_2_members (`campaign_id`, `mobile`, `email`, `vote`, `vote_date`, `current_time`)
SELECT `campaign_id`, `from_number`, '[email protected]', `received_msg`, `date_received`, 1502309889 FROM `received_txts` WHERE `campaign_id` = '8'

Na consulta acima, existem 2 colunas extras denominadas email e current_time .

IamMHussain
fonte
2
E se eu quisesse inserir três linhas de dados com os mesmos valores dos valores selecionados, mas diferentes para as colunas 'adicionais' adicionadas, como email e current_time?
Xxstevenxo
4
INSERT INTO Table1 SELECT * FROM Table2
Mher Arsh
fonte
Esta é uma resposta de qualidade muito baixa. Além disso, diferentemente da resposta aceita, ele nem tenta se relacionar com as informações incluídas na pergunta.
Mike
0
INSERT INTO preliminary_image (style_id,pre_image_status,file_extension,reviewer_id,
uploader_id,is_deleted,last_updated) 

SELECT '4827499',pre_image_status,file_extension,reviewer_id,
uploader_id,'0',last_updated FROM preliminary_image WHERE style_id=4827488

Análise

Podemos usar a consulta acima se queremos copiar dados de uma tabela para outra no mysql

  1. Aqui a tabela de origem e destino é a mesma, podemos usar tabelas diferentes também.
  2. Poucas colunas não estão sendo copiadas como style_id e is_deleted, então as selecionamos em outra tabela
  3. A tabela que usamos na fonte também contém o campo de incremento automático, então deixamos a coluna e ela é inserida automaticamente com a execução da consulta.

Resultados de execução

1 consultas executadas, 1 sucesso, 0 erros, 0 avisos

Consulta: insira na imagem preliminar (id_do_estilo, status_de_imagem, extensão_do_arquivo, id_do revisor, id_do uploader_id, is_deleted, last_updated) selecione ...

5 linha (s) afetada (s)

Tempo de Execução: 0.385 s Tempo de Transferência: 0 s Tempo Total: 0.386 s

Amit Jain
fonte