Obter instrução Insert para linha existente no MySQL

139

Usando o MySQL, posso executar a consulta:

SHOW CREATE TABLE MyTable;

E ele retornará a instrução create table para a tabela específica. Isso é útil se você já possui uma tabela criada e deseja criar a mesma tabela em outro banco de dados.

É possível obter a instrução de inserção para uma linha já existente ou conjunto de linhas? Algumas tabelas têm muitas colunas e seria bom conseguir uma instrução de inserção para transferir linhas para outro banco de dados sem precisar gravar a instrução de inserção ou exportar os dados para CSV e importar os mesmos dados no outro banco de dados.

Só para esclarecer, o que eu quero é algo que funcione da seguinte maneira:

SHOW INSERT Select * FROM MyTable WHERE ID = 10;

E retorne o seguinte para mim:

INSERT INTO MyTable(ID,Col1,Col2,Col3) VALUES (10,'hello world','some value','2010-10-20');
Kibbee
fonte
Qual ferramenta você usa para se conectar ao banco de dados? Alguns programas fornecem esses modelos.
GôTô 20/10/10
2
@ kibbee, Você encontrou alguma solução para isso?
Hasina
2
Adoraria uma resposta que mostrasse as instruções INSERT no mysql>prompt. Até agora, nenhum.
23415 Bob Stein
você encontrou alguma solução para isso, para obter a instrução insert programaticamente?
precisa

Respostas:

155

Não parece haver uma maneira de obter as INSERTinstruções do console do MySQL, mas você pode obtê-las usando o mysqldump como Rob sugeriu. Especifique -tpara omitir a criação da tabela.

mysqldump -t -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10"
Kaivosukeltaja
fonte
Ver este se você começar o mysqldump de erro: Não foi possível executar 'SELECT @@ GTID_MODE': variável de sistema 'GTID_MODE' Desconhecido (1193) gist.github.com/arun057/5556563
Daniel Schaffer
10
E você pode adicionar "--complete-insert" se quiser que os nomes de campo / coluna com a instrução de inserção
MeatPopsicle
3
--single-transaction
FelikZ
e --hex-blobse você tiver colunas de blob (por exemplo, a bit(1)), ela seria gravada como string, o que poderia resultar em Unknown command '\0'erro ao executar o INSERT.
moffeltje
79

No MySQL Workbench, você pode exportar os resultados de qualquer consulta de tabela única como uma lista de INSERTinstruções. Basta executar a consulta e, em seguida:

Instantâneo do botão Exportar

  1. clique no disquete logo Export/Importacima dos resultados
  2. dar um nome ao arquivo de destino
  3. na parte inferior da janela, para FormatselecionarSQL INSERT statements
  4. clique Save
  5. clique Export
Zoltán
fonte
2
Além disso, o ícone à direita é muito útil para importar a exportação que você acabou de criar. Recurso muito bom. A única parte complicada é que você só pode acessar os ícones no painel do conjunto de resultados após uma seleção.
Half_Duplex 21/09/19
13

Como você copiou a tabela com o SQL produzido por SHOW CREATE TABLE MyTable , você pode fazer o seguinte para carregar os dados na nova tabela.

INSERT INTO dest_db.dest_table SELECT * FROM source_db.source_table;

Se você realmente deseja as instruções INSERT, a única maneira que conheço é usar o mysqldump http://dev.mysql.com/doc/refman/5.1/en/mysqldump.htm . Você pode oferecer opções para apenas despejar dados de uma tabela específica e até limitar linhas.

Rob Prouse
fonte
As bases de dados em exist pergunta sobre fisicamente máquinas diferentes, em diferentes redes, de modo que este método não funcionaria para mim, mas funciona bem para bancos de dados que funcionam na mesma instância do MySQL
Kibbee
Você está tentando mover programaticamente subconjuntos de dados entre máquinas? Você não pode escravizar a segunda máquina para espelhar dados e depois mover seus subconjuntos entre bancos de dados no escravo?
Rob Prouse
1
Vamos, pelo bem do argumento, dizer que tenho uma tabela que contém fusos horários. Agora, por algum motivo, um novo fuso horário é criado (talvez com um deslocamento de 15 minutos ou algo parecido). Portanto, adiciono a nova linha ao banco de dados de desenvolvimento que contém todas as informações sobre o novo fuso horário e faço todos os testes necessários. Quando chega a hora de mover essas informações de fuso horário para o banco de dados de produção, preciso criar uma instrução de inserção do zero ou fazer uma exportação / importação. Seria bom poder obter a inserção e incluí-la nos scripts para trazer o novo fuso horário.
Kibbee
1
Não tenho a inserção original porque posso inseri-la usando uma ferramenta GUI ou talvez tenha sido alterada três vezes em relação aos valores originais inseridos.
Kibbee
1
Por acaso, estava precisando de uma solução simples para bancos de dados na mesma máquina e o google me trouxe aqui. Então, eu sou grato por esta resposta, mesmo que fosse fora do contexto da pergunta original :)
Jason McCarrell
10

Eu escrevi uma função php que fará isso. Eu precisava fazer uma instrução de inserção caso um registro precisasse ser substituído após a exclusão de uma tabela de histórico:

function makeRecoverySQL($table, $id)
{
    // get the record          
    $selectSQL = "SELECT * FROM `" . $table . "` WHERE `id` = " . $id . ';';

    $result = mysql_query($selectSQL, $YourDbHandle);
    $row = mysql_fetch_assoc($result); 

    $insertSQL = "INSERT INTO `" . $table . "` SET ";
    foreach ($row as $field => $value) {
        $insertSQL .= " `" . $field . "` = '" . $value . "', ";
    }
    $insertSQL = trim($insertSQL, ", ");

    return $insertSQL;
}
Chris Adams
fonte
3
Esta solução é bastante frágil. Por exemplo, se um dos seus registros contiver o nome O' Malley, as consultas geradas terão erros de sintaxe devido a aspas simples incompatíveis. Você deve pelo menos usar mysql_real_escape_stringse seguir esta rota.
Eric Seastrand
ainda coisas legais, eu vou usá-lo com certeza
user7082181 29/06
9

O código do Laptop Lift funciona bem, mas havia algumas coisas que eu imaginei que as pessoas pudessem gostar.

O manipulador de banco de dados é um argumento, não codificado. Utilizou a nova API do mysql. $ Id substituído por um argumento $ where opcional para flexibilidade. Utilizado real_escape_string no caso de alguém já ter tentado fazer injeção de sql e evitar quebras simples envolvendo aspas. Usou a INSERT table (field...) VALUES (value...)...sintaxe para que os campos sejam definidos apenas uma vez e apenas liste os valores de cada linha (implode é impressionante). Porque Nigel Johnson apontou, eu adicionei NULLmanipulação.

Eu usei $array[$key]porque estava preocupado que isso pudesse mudar de alguma forma, mas, a menos que algo esteja terrivelmente errado, não deveria.

<?php
function show_inserts($mysqli,$table, $where=null) {
    $sql="SELECT * FROM `{$table}`".(is_null($where) ? "" : " WHERE ".$where).";";
    $result=$mysqli->query($sql);

    $fields=array();
    foreach ($result->fetch_fields() as $key=>$value) {
        $fields[$key]="`{$value->name}`";
    }

    $values=array();
    while ($row=$result->fetch_row()) {
        $temp=array();
        foreach ($row as $key=>$value) {
            $temp[$key]=($value===null ? 'NULL' : "'".$mysqli->real_escape_string($value)."'");
        }
        $values[]="(".implode(",",$temp).")";
    }
    $num=$result->num_rows;
    return "INSERT `{$table}` (".implode(",",$fields).") VALUES \n".implode(",\n",$values).";";
}
?>
Chinoto Vokro
fonte
Não tenho certeza sobre o que falta INTOem INSERT INTO {$tables}mas não há manipulação de valores nulos na tabela.
Nigel Johnson
1
@NigelJohnson INTOé completamente opcional . Eu adicionei manipulação de nulos a ele.
Chinoto Vokro
6

Eu uso o programa SQLYOG, onde posso fazer uma consulta de seleção, apontar para captura de telaos resultados e escolher exportar como sql. Isso me dá as instruções de inserção.

Henrik
fonte
Apenas para evitar confusão, diz o formato sql, mas na verdade exporta no formato mysql.
Kumar Vikramjeet 27/08/2015
Obrigado .... +1, pois funcionou para mim. Mas não foi possível obter apenas as linhas selecionadas. :( Seu método que dê inserção consulta para todas as linhas da tabela.
Mukit09
5

Na bancada de trabalho do MySQL, faça o seguinte:

  1. Clique em Servidor> Exportação de Dados

  2. Na guia Seleção de objeto, selecione o esquema desejado.

  3. Em seguida, selecione as tabelas desejadas usando a caixa de listagem à direita do esquema.

  4. Selecione um local do arquivo para exportar o script.

  5. Clique em Finish.

  6. Navegue para o arquivo recém-criado e copie as instruções de inserção.

Kevin Bowersox
fonte
esta é uma exportação completa da tabela, não um linhas específicas exportadores
Yehia
4

Se você deseja obter "inserir instrução" para sua tabela, tente o seguinte código.

SELECT 
    CONCAT(
        GROUP_CONCAT(
            CONCAT(
                'INSERT INTO `your_table` (`field_1`, `field_2`, `...`, `field_n`) VALUES ("',
                `field_1`,
                '", "',
                `field_2`,
                '", "',
                `...`,
                '", "',
                `field_n`,
                '")'
            ) SEPARATOR ';\n'
        ), ';'
    ) as `QUERY`
FROM `your_table`;

Como resultado, você terá a declaração insers:

INSERT INTO your_table( field_1, field_2, ..., field_n) VALUES (Valor_11, value_12, ..., value_1n);

INSERT INTO your_table( field_1, field_2, ..., field_n) VALUES (value_21, Valor_22, ..., value_2n);

/ ................................................. .... /

INSERT INTO your_table( field_1, field_2, ..., field_n) VALUES (value_m1, value_m2, ..., value_mn);

, onde m - número de registros em sua_tabela

slava157
fonte
4
Você poderia fornecer um pouco mais à sua resposta do que apenas um bloco de código colado?
Matt Fletcher
sim, mas esse código é codificado, field_ * são nomes estáticos. Ele faz metade do trabalho, e isso faz com que não tão bem
Daniele Cruciani
por que GROUP_CONCAT?
sealabr
3

você pode usar o Sequel pro para fazer isso, existe uma opção para 'obter como instrução de inserção' para os resultados obtidos

instantâneo
fonte
3

No PHPMyAdmin, você pode:

  1. clique em copiar na linha em que deseja conhecer suas instruções de inserção SQL:

Selecionar cópia

  1. clique em Visualizar SQL:

Selecione Visualizar

  1. você receberá a instrução de inserção criada que a gera

Você pode aplicá-lo em várias linhas ao mesmo tempo, se selecioná-las e clicar em copiar na parte inferior da tabela e, em seguida, Visualizar SQl

Mosab B. Nazli
fonte
Adicione mais explicações e informações à sua resposta
Ramin eghbalian 27/02
1

Com o DOP, você pode fazer dessa maneira.

$stmt = DB::getDB()->query("SELECT * FROM sometable", array());

$array = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $fields = array_keys($array[0]);

    $statement = "INSERT INTO user_profiles_copy (".implode(",",$fields).") VALUES ";
    $statement_values = null;

    foreach ($array as $key => $post) {
        if(isset($statement_values)) {
            $statement_values .= ", \n";
        }

        $values = array_values($post);
        foreach($values as $index => $value) {
            $quoted = str_replace("'","\'",str_replace('"','\"', $value));
            $values[$index] = (!isset($value) ? 'NULL' : "'" . $quoted."'") ;
        }

        $statement_values .= "(".implode(',',$values).")";


    }
    $statement .= $statement_values . ";";

    echo $statement;
Josh Bernfeld
fonte
1

Você pode criar um SP com o código abaixo - ele também suporta NULLS.

select 'my_table_name' into @tableName;

/*find column names*/
select GROUP_CONCAT(column_name SEPARATOR ', ') from information_schema.COLUMNS
where table_schema =DATABASE()
and table_name = @tableName
group by table_name
into @columns
;

/*wrap with IFNULL*/
select replace(@columns,',',',IFNULL(') into @selectColumns;
select replace(@selectColumns,',IFNULL(',',\'~NULL~\'),IFNULL(') into @selectColumns;

select concat('IFNULL(',@selectColumns,',\'~NULL~\')') into @selectColumns;

/*RETRIEVE COLUMN DATA FIELDS BY PK*/
SELECT
  CONCAT(
    'SELECT CONCAT_WS(','''\'\',\'\''',' ,
    @selectColumns,
    ') AS all_columns FROM ',@tableName, ' where id = 5 into @values;'
    )
INTO @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;

/*Create Insert Statement*/
select CONCAT('insert into ',@tableName,' (' , @columns ,') values (\'',@values,'\')') into @prepared;

/*UNWRAP NULLS*/
select replace(@prepared,'\'~NULL~\'','NULL') as statement;
snyman
fonte
1

Para usuários do HeidiSQL :

Se você usa HeidiSQL, pode selecionar as linhas que deseja obter na instrução de inserção. Em seguida, clique com o botão direito do mouse em> Exportar linhas da grade> selecione "Copiar para a área de transferência" para "Destino de saída", "Seleção" para "Seleção de linha" para não exportar outras linhas, "SQL INSERTs" para "Formato de saída"> Clique em OK.

insira a descrição da imagem aqui

A instrução de inserção estará dentro da área de transferência.

cair
fonte
0

Eu acho que a resposta fornecida pelo Laptop Lifts é a melhor ... mas, como ninguém sugeriu a abordagem que eu uso, achei que deveria concordar. Eu uso o phpMyAdmin para configurar e gerenciar meus bancos de dados na maioria das vezes. Nele, você pode simplesmente colocar marcas de seleção ao lado das linhas que deseja e, na parte inferior, clicar em "Exportar" e escolher SQL. Ele fornecerá instruções INSERT para os registros selecionados. Espero que isto ajude.

teatro
fonte
-1

Com base nos seus comentários, seu objetivo é migrar as alterações do banco de dados de um ambiente de desenvolvimento para um ambiente de produção.

A melhor maneira de fazer isso é manter as alterações no seu banco de dados no código-fonte e, consequentemente, rastreá-las no seu sistema de controle de fontes, como git ou svn.

você pode começar a trabalhar rapidamente com algo assim: https://github.com/davejkiger/mysql-php-migrations

como uma solução customizada muito básica em PHP, você pode usar uma função como esta:

function store_once($table, $unique_fields, $other_fields=array()) {
    $where = "";
    $values = array();
    foreach ($unique_fields as $k => $v) {
        if (!empty($where)) $where .= " && ";
        $where .= "$k=?";
        $values[] = $v;
    }
    $records = query("SELECT * FROM $table WHERE $where", $values);
    if (false == $records) {
        store($table, array_merge($unique_fields, $other_fields));
    }
}

então você pode criar um script de migração que atualizará qualquer ambiente com suas especificações.

Ali Gangji
fonte