MySQL: INSERT com SELECT na mesma query

Muitas vezes é necessário fazer um insert de dados em uma tabela trazendo resultados de outra na mesma base ou em bases diferentes. Como fazer? Simples:

INSERT INTO banco.tabela-destino (campo1, campo2, campo3...)
SELECT campo1,campo2,campo3... FROM banco.tabela-origem;

Atente-se para que os campos estejam na mesma seqüência tanto na instrução INSERT quanto na instrução SELECT pois é seguida a seqüência de campos em ambas as instruções. Também não se esqueça do ponto e vírgula no final da última instrução. Imprescindível.

This entry was posted in MySQL and tagged , , , , . Bookmark the permalink.

38 Responses to MySQL: INSERT com SELECT na mesma query

  1. Fabiano Monteiro says:

    CODARE de parabéns! Está no meu leitor de feeds…

  2. Diogo Souza says:

    Só para acrescentar que o mesmo pode ser feito com UPDATE, desde que não da mesma tabela. ;)

  3. Esta é a idéia Diogo, a sequência de INSERT e SELECT pode ser feita dentro da mesma, o que não é possível com o UPDATE.

    Obrigado pela visita.

  4. Silvana says:

    Achei muito bom o insert com select, mas como faço para habilitar o connect em dois db’s diferentes ao mesmo? Pois no meu caso preciso mover dados entre duas tabelas de bancos diferentes.

  5. VitorGGA says:

    Rápido e rasteiro uhsuhsuh

  6. Tarilonte says:

    Obrigado pela dica!

  7. GIOVANNI CRUZ says:

    Silvana,

    Temos dois bancos, sendo eles representados por “A” e “B”, o banco “A” será especificado na cláusula “Insert” o banco “B” na cláusula “Select”, conforme código descrito abaixo:

    INSERT INTO banco_A.tabela-destino (campo1, campo2, campo3…)
    SELECT campo1,campo2,campo3… FROM banco_B.tabela-origem;

  8. frentis says:

    sera que assim nao funciona?

    INSERT INTO visitas (
    `idvisitas` ,
    `iddmeu` ,
    `iddamigo` ,
    `ddatehora` ,
    `ip`
    )
    VALUES (
    NULL , ’7′, ’90′, ’2011-03-22 08:22:39′, ’1′
    )
    WHERE ip !=’1′);

  9. Olá pessoal, eu tenho uma dúvida, toda vez presciso fazer duas consultas uma para verificar se a registros, se tiver eu coloco um if no php e se caso der zero dou um insert ou dou um update. Tem com colocar tudo em uma query?

  10. arilson piovezan says:

    Olá

    Preciso selecionar todos os dados de uma tabela e inserir todos estes dados noutra tabela, no memso banco. Só consegui inserir uma linha com os dados.

    Se algúem poder me ajudar !

    Obrigado,

    Arilson

    • arilson piovezan says:

      Seguem os códigos.


      $query="SELECT limpas.* FROM limpas WHERE lrg ='$tombo_rg' ";
      $resultado = mysql_query($query) or die(mysql_error());
      $cont= mysql_num_rows($resultado) or die (mysql_error());
      while($row = mysql_fetch_array($resultado))
      {
      $lrg= $row["lrg"];
      $ocodata =$row["ocodata"];
      $assunto =$row["assunto"];
      $historico= $row["historico"];
      }
      $sql = "INSERT INTO tombolimpas (lrg, ocodata, assunto,historico
      )
      VALUES ('$lrg', '$ocodata', '$assunto', '$historico' )";
      $result = mysql_query($sql) or die(mysql_error());

  11. arilson piovezan says:

    Boa Tarde

    Utilizei a idéia do post e deu certo.
    Troquei todo alquele código já postado por este:

    $sql = "INSERT INTO tombolimpas (lrg, ocodata, assunto, historico) SELECT lrg, ocodata, assunto, historico FROM limpas WHERE lrg = '$tombo_rg'";
    $result = mysql_query($sql) or die(mysql_error());

  12. Jairo Junior says:

    Boa Tarde, estou iniciando em PHP e estou com um problema…
    Exemplo:
    tabela entrada;
    id_codigo
    valor1

    tabela saida;
    id_codigo_saida
    valor2

    tabela situacao;
    total

    preciso fazer o total ser a subtração do valor1 – valor2
    nao sei como fazer.
    alguem pode me ajudar?

  13. Paulino Michelazzo says:

    Se está fazendo com PHP, basta trazer os valores dos campos, subtraí-los e depois inserir na tabela nova. Simples assim.

    Abraços

  14. ótima dica, testei usando o Heidi e funcionou perfeitamente. Acredito que rodando dentro do PHPMYADMIN também funcione… mas como vou fazer isso no código PHP, pois pelo que sei posso conectar apenas em um banco de cada vez.

    Me compreende?
    Abraço!

  15. Paulino Michelazzo says:

    Olá Carlos,

    Você pode se conectar via PHP a quantos DB’s quiser ao mesmo tempo. Se você observar a função mysql_connect do PHP, poderá ver que o primeiro parâmetro é o servidor. Trocando este parâmetro poderá fazer a conexão.

    Alguns exemplos podem ser vistos em:

    http://bytes.com/topic/php/answers/721490-connecting-two-mysql-tables-different-databases

    Abs
    Paulino

  16. Olhei o link que me mandou e achei que iria dar certo, mas não deu não.

    Quero selecionar os dados de uma tabela e passar para outra tabela, porém elas não estão na mesma base de dados, são dois bancos mysql.

    tenho no meu PHP a query abaixo, sendo que a tabelaA esta em um banco chamado “dados” a tabelaB está em um banco chamado de “antigo”
    $query=”INSERT INTO tabelaA (campo1, campo2, campo3…)
    SELECT campo1,campo2,campo3… FROM tabelaB”

    mysql_query($query, ?) // passo quais das conexões aqui a que conecta no primeiro ou no segundo banco. Qualquer uma que passo da erro.

    Grato amigo

  17. Paulino Michelazzo says:

    Acho que vc esqueceu de dizer os nomes dos bancos antes das tabelas.

    tabelaA.bancoX

    Verifique

  18. Luciano H says:

    Como faço a leitura de tres tabelas
    para inserir e uma diferente
    exemplo:
    select produto id,( listagem de produtos)
    select bem id,(aqui seria teria a opçao 0 =RMA e 1 = RMB )
    setect recurso id, (0 =FAT e 1 =tesouro)
    isso seria inserido em outras duas tabelas para gerar 2 relatorios distintos RMA e RMB com opçoes de FAT e Tesouro

  19. Eric says:

    Como faço para fazer um insert em uma tabela utilizando um valor fixo e um select?
    Exemplificando, eu preciso inserir valores de duas tabelas, sendo que teria de ser um determinado valor de uma das tabelas e vários valores de outra tabela, para que ficasse assim:
    Tabela X
    Coluna A Coluna B
    555 115
    555 135
    555 138
    555 139
    555 142

    Neste caso, a tabela teria de ter a coluna A com um valor da tabela Y e este valor seria sempre igual. A coluna B receberia os dados de um campo da tabela Z de acordo com um select.

    • Renan says:

      Do mesmo jeito.
      INSERT INTO Tabela X (Coluna A, Coluna B)
      (SELECT 555, Valor_Do_Select FROM Tabela Y)

  20. Ghaleon says:

    No meu caso, uso gerenciador MySql e C#
    Posso também iniciar 2 MySqlCommand e 2 MySqlConnection
    um para cada banco… 1 para o INSERT e outro para o SELECT

    certo?

    Preciso selecionar dados de uma tabela e por na outra, nome dos campos são diferentes também… Alguma dica de como fazer isso ?! :D

  21. Hermes Siqueira says:

    Pessoal, tenho a necessidade de fazer um select que gere comando “instert into” para cada linha de select, porem que nao insira em nenhuma tabela. Que me gere somente o comando em texto.
    Tenho 2 bancos de daod iguais, mas em servidores que nao tem nenhuma ligacao entre si. O objetivo é fazer o select na origem e o insert no destino.
    Tem como?
    Grato

  22. Douglas Metheus says:

    Boa noite, eu preciso de uma ajuda, estou tentando inserir o registro mas precisava gerar um id de acordo com o último registro na minha tabela é possível ?
    Obrigado desde já.

  23. Pessoal estou tentando fazer isso no meu banco mas não estou conseguindo o que estou errando???

    NSERT INTO `adm`.`tb_operador_historico`
    (`USERNAME`,
    `HORA`,
    `DATA`,
    `NM_OPERADOR`)
    VALUES
    (
    ‘pedrod’,
    ’12’,
    ‘2013-08-03’,
    select NM_OPERADOR,username from TB_OPERADOR where username like ‘pedrod’
    );

    • olo says:

      lol

      • robson says:

        Primeiro esta faltando o I no INSERT
        INSERT INTO `adm`.`tb_operador_historico`
        (`USERNAME`,`HORA`,`DATA`,`NM_OPERADOR`)
        VALUES (‘pedrod’,’12’,’2013-08-03′, (select NM_OPERADOR,username from TB_OPERADOR where username like ‘pedrod’)
        );

  24. Sergius says:

    Como faço um insert numa tabela, trazendo somente um registro de outra tabela?

    Estou tributando uma série de produtos. Na tabela de tributação tenho além das colunas dos tributos, tenho a coluna codigo do produto que puxa da tabela de produtos. Tenho que ir inserindo cada produto com sua tributação.

    Agradeço desde já pela ajuda.

  25. Rodrigo Dini Jorge says:

    Até que em fim alguém que soube explicar esta situação de maneira didática e clara.

    Parabéns pelo post!!!

  26. Pedro B Amaral says:

    Reativando o post, pois foi o melhor que encontrei…
    Preciso duplicar registros de uma tabela, conforme uma condicional aplicada em um determinado campo. Exemplo:
    Tabela site_rodape com os campos:
    ID, edicao, idioma, rodape_texto
    1 13 portugues texto
    1 14 portugues texto
    2 14 ingles texto
    3 14 espanhol texto
    4 14 frances texto

    preciso duplicar todos os registros da tabela onde ‘edicao’ = 14 … trocando para 15 (edição +1), incrementando o ID.
    Se utilizo a setença no phpMyAdmin:
    INSERT INTO site_rodape (edicao, idioma, rodape_texto)
    SELECT 15, idioma, rodape_texto FROM site_rodape
    WHERE edicao=’14’
    …. funiona perfeitamente… são criados os IDs 5,6,7 e 8 com os mesmos conteúdos, trocando a edição para 15.
    Mas como fazer para que funcione num script PHP (por exemplo: criar_edicoes.php)?
    Efetuei várias tentativas, que não retornam nenhum erro, mas não processam.

    Grato a quem puder ajudar.

    • Paulino Michelazzo says:

      Pedro,

      Certamente você está usando a função mysql_query() do PHP. Se é isso, uma má notícia para você. Esta função não permite a execução de queries simultâneas e por isso deve estar tendo problemas.

      Dê uma olhada nesta URL. Ela pode lhe ajudar:
      http://www.dev-explorer.com/articles/multiple-mysql-queries

      Saudações

      • Pedro B Amaral says:

        Olá Paulimo,

        Primeiramente, obrigado pela presteza. Acessei o link, mas não se trata de nossa necessidade. Apesar de usarmos mysql_query(), não processamos simultâneas.

        Conseguimos processar, utilizando o código abaixo (trecho):
        ==============
        $checa_edicao = mysql_query(“SELECT * FROM `configuracoes` WHERE `descricao`=’edicao_atual’ and `valor`=’$atual[valor]'”) or die (“Erro ao buscar edicao atual.”);
        $busca_edicao = mysql_fetch_array($checa_edicao);
        $atual = $busca_edicao[‘valor’];

        $query2 = “SELECT * FROM site_rodape where edicao=’$atual'”;
        $result2 = mysql_query($query2) or die(mysql_error());
        $cont= mysql_num_rows($result2) or die(mysql_error());

        while($row = mysql_fetch_array($result2))
        {
        $idioma = $row[“idioma”];
        $rodape_texto = $row[“rodape_texto”];
        $edicao = $row[“edicao”];
        $edicao_trabalho = $edicao + 1;
        $insere = “INSERT INTO `site_rodape` (`edicao`, `idioma`, `rodape_texto`) VALUES (‘$edicao_trabalho’, ‘$idioma’, ‘$rodape_texto’)”;
        $result = mysql_query($insere) or die(mysql_error());
        }
        ===============
        Saudações.

  27. Irc Miguel says:

    Ótima dica!

    Obrigado.

  28. Bom dia, poderiam me ajudar neste caso, de um insert de dados de uma tabela temporaria ?

    CREATE TEMPORARY TABLE qproe AS (SELECT loja, probarx, MAX(proano) as proano, MAX(promes) as promes from dbft_vcaproe where proano<=xanoa AND promes<=xmesa group by loja, probarx);
    CREATE TEMPORARY TABLE qproe1 AS (SELECT dbft_vcaproe.* from dbft_vcaproe,qproe where dbft_vcaproe.proano=qproe.proano AND dbft_vcaproe.promes=qproe.promes);

    insert into dbft_vcaproe (loja, probarx, procod, proano, promes, proqan, procan, proqat, procat, prodcp, proded, prodeo, prodvd, prodsd, prodso) values ('qproe1.loja', 'qproe1.probarx', 'qproe1.procod', 'qproe1.proano', 'qproe1.promes', 'qproe1.proqat', 'qproe1.procat', 'qproe1.proqat', 'qproe1.procat', '0000-00-00', '0000-00-00', '0000-00-00', '0000-00-00', '0000-00-00', '0000-00-00') ;

    isso está em uma procedure no mysql, porem como deve ser colocado os dados no "value" ?, pq se eu deixar sem as aspas simples ou duplas, da erro de coluna nao existe.

    Abs,.

  29. Igor Wanderley says:

    Muito bom o post, esta de parabéns…
    Gostaria de compartilhar com todos a seguinte instrução que encontrei na internet a algum tempo atrás, que insere na tabela caso não exista na tabela:

    INSERT INTO nome_da_tabela (campo_um, campo_dois, campo_tres, campo_n)
    SELECT “valor_campo_um”,”valor_campo_dois”, “valor_campo_tres”, “valor_campo_n”
    FROM DUAL WHERE NOT EXISTS (SELECT * FROM nome_da_tabela WHERE campo_um = “valor_campo_um_a_verificar”);

    Bom espero ter ajudado!

  30. Jefferson says:

    Senhores,
    Será que eu conseguiria um inner join no select?

    exemplo:
    INSERT INTO tabela_destino(campo1,campo2,campo3…)
    SELECT c.codigo_cidade,o.campo2,o.campo3… FROM tabela_origem o
    INNER JOIN cidades c ON o.campo1 = c.nome_cidade;

    Explico:
    A tabela de origem foi criada há muitos anos, quando ainda não se falava em banco de dados relacional. Então, nela foi armazenado o nome da cidade, e não o código, como preciso fazer na tabela destino. Assim, pego o nome da cidade na tabela origem e verifico na tabela cidades qual o seu respectivo código para inserir na tabela destino.

    Acho que é isso, valeu a quem puder me ajudar!!

Comments are closed.