web-dev-qa-db-fra.com

Obtenir une instruction d'insertion pour une ligne existante dans MySQL

En utilisant MySQL, je peux exécuter la requête:

SHOW CREATE TABLE MyTable;

Et il renverra l'instruction create table pour la table spécifique. Ceci est utile si vous avez déjà créé une table et souhaitez créer la même table sur une autre base de données.

Est-il possible d'obtenir l'instruction insert pour une ligne ou un ensemble de lignes déjà existant? Certaines tables ont de nombreuses colonnes et il serait intéressant pour moi de pouvoir obtenir une instruction insert pour transférer des lignes vers une autre base de données sans avoir à écrire l'instruction insert ou sans exporter les données au format CSV, puis importer les mêmes données. dans l'autre base de données.

Juste pour clarifier, ce que je veux est quelque chose qui fonctionnerait comme suit:

SHOW INSERT Select * FROM MyTable WHERE ID = 10;

Et avoir ce qui suit rendu pour moi:

INSERT INTO MyTable(ID,Col1,Col2,Col3) VALUES (10,'hello world','some value','2010-10-20');
115
Kibbee

Il ne semble pas y avoir de moyen d'obtenir les instructions INSERT à partir de la console MySQL, mais vous pouvez les obtenir en utilisant mysqldump comme l'a suggéré Rob. Spécifiez -t pour omettre la création de table.

mysqldump -t -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10"
137
Kaivosukeltaja

Dans MySQL Workbench, vous pouvez exporter les résultats de toute requête à table unique sous forme de liste d'instructions INSERT. Il suffit de lancer la requête, puis:

Snapshot of export button

  1. cliquez sur la disquette près de Export/Import au-dessus des résultats
  2. donner un nom au fichier cible
  3. au bas de la fenêtre, pour Format, sélectionnez SQL INSERT statements
  4. cliquez Save
  5. cliquez Export
55
Zoltán

J'ai écrit une fonction php qui le fera. Je devais faire une déclaration insert au cas où un enregistrement doit être remplacé après suppression pour une table d'historique:

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;
}
10
Chris Adams

Puisque vous avez copié la table avec le code SQL produit par SHOW CREATE TABLE MyTable , vous pouvez simplement procéder comme suit pour charger les données dans la nouvelle table.

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

Si vous voulez vraiment les instructions INSERT, le seul moyen que je connaisse est d’utiliser mysqldump http: //dev.mysql. com/doc/refman/5.1/fr/mysqldump.htm . Vous pouvez lui donner la possibilité de vider les données d’une table spécifique et même de limiter le nombre de lignes.

10
Rob Prouse

Le code de Laptop Lift fonctionne bien, mais je pensais que certaines choses pourraient plaire aux gens.

Le gestionnaire de base de données est un argument, pas codé en dur. Utilisé le nouvel api mysql. $ Id remplacé par un $ optionnel argument pour la flexibilité. Real_escape_string utilisé au cas où quelqu'un aurait déjà essayé de faire une injection SQL et d'éviter de simples ruptures impliquant des guillemets. Utilisez la syntaxe INSERT table (field...) VALUES (value...)... pour que les champs ne soient définis qu'une seule fois, puis listent simplement les valeurs de chaque ligne (implode est génial). Comme Nigel Johnson l’a souligné, j’ai ajouté NULL traitement.

J'ai utilisé $array[$key] parce que je craignais que cela change, mais à moins que quelque chose ne se passe horriblement mal, cela ne devrait de toute façon pas être le cas.

<?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).";";
}
?>
9
Chinoto Vokro

J'utilise le programme SQLYOG où je peux faire une requête select, pointer surscreenshot les résultats et choisissez export en tant que sql. Cela me donne les déclarations d'insertion.

6
Henrik

Dans MySQL, les tâches suivantes sont effectuées:

  1. Cliquez sur Serveur> Exportation de données.

  2. Dans l'onglet Sélection d'objet, sélectionnez le schéma souhaité.

  3. Ensuite, sélectionnez les tables souhaitées à l'aide de la zone de liste située à droite du schéma.

  4. Sélectionnez un emplacement de fichier pour exporter le script.

  5. Cliquez sur Terminer.

  6. Accédez au fichier nouvellement créé et copiez les instructions d'insertion.

5
Kevin Bowersox

Si vous voulez obtenir "insert statement" pour votre table, vous pouvez essayer le code suivant.

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`;

En conséquence, vous aurez la déclaration insers:

INSÉRER DANS your_table (field_1, field_2, ..., field_n) VALUES (valeur_11, valeur_12, ..., valeur_1n);

INSÉRER DANS your_table (field_1, field_2, ..., field_n) VALUES (valeur_21, valeur_22, ..., valeur_2n);

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

INSÉRER DANS your_table (field_1, field_2, ..., field_n) VALUES (valeur_m1, valeur_m2, ..., valeur_mn);

, où m - nombre d'enregistrements dans votre_table

4
slava157

vous pouvez utiliser Sequel pro pour cela, il existe une option permettant d’obtenir "une déclaration d’insertion" pour les résultats obtenus.

3
flash

Avec PDO, vous pouvez le faire de cette façon.

$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;
1
Josh Bernfeld

Pour les utilisateurs de HeidiSQL :

Si vous utilisez HeidiSQL, vous pouvez sélectionner la ou les lignes pour lesquelles vous souhaitez obtenir une instruction insert. Cliquez ensuite avec le bouton droit de la souris sur> Exporter les lignes de la grille> sélectionnez "Copier dans le presse-papiers" pour "Cible de sortie", "Sélection" pour "Sélection de lignes" afin de ne pas exporter les autres lignes, "INSERT SQL" pour "Format de sortie"> Cliquez sur OK.

enter image description here

La déclaration d'insertion sera dans votre presse-papiers.

1
fall

Vous pouvez créer un SP avec le code ci-dessous - il prend également en charge 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;
1
snyman

Je pense que la réponse fournie par Laptop Lifts est la meilleure ... mais puisque personne n’a suggéré l’approche que j’utilise, j’ai donc pensé que je devrais intervenir. J’utilise phpMyAdmin pour configurer et gérer mes bases de données la plupart du temps. Dans celui-ci, vous pouvez simplement mettre des coches à côté des lignes que vous voulez, et en bas, cliquez sur "Exporter" et choisissez SQL. Il vous donnera des instructions INSERT pour les enregistrements que vous avez sélectionnés. J'espère que cela t'aides.

0
techtheatre