197 votes

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;

Il renverra l'instruction de création de table pour la table spécifiée. Cette fonction est utile si vous avez déjà créé une table et que vous souhaitez créer la même table dans une autre base de données.

Est-il possible d'obtenir la déclaration d'insertion pour une ligne ou un ensemble de lignes déjà existantes ? Certaines tables ont de nombreuses colonnes, et il serait bon que je puisse obtenir une instruction d'insertion pour transférer des lignes dans une autre base de données sans avoir à écrire l'instruction d'insertion, ou sans exporter les données au format CSV et importer ensuite les mêmes données dans l'autre base de données.

Pour clarifier, ce que je veux, c'est quelque chose qui fonctionnerait comme suit :

SHOW INSERT Select * FROM MyTable WHERE ID = 10;

Et que l'on me renvoie ce qui suit :

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

208voto

Kaivosukeltaja Points 6219

Il ne semble pas y avoir de moyen d'obtenir l'information sur les INSERT à partir de la console MySQL, mais vous pouvez les obtenir en utilisant la commande mysqldump comme l'a suggéré Rob. Préciser -t pour ne pas créer de table.

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

126voto

Zoltán Points 2915

Dans MySQL Workbench, vous pouvez exporter les résultats de n'importe quelle requête portant sur une seule table sous la forme d'une liste de INSERT déclarations. Il suffit d'exécuter 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électionner SQL INSERT statements
  4. cliquer Save
  5. cliquer Export

16voto

Rob Prouse Points 9193

Puisque vous avez copié la table avec le code SQL produit par SHOW CREATE TABLE MaTable Pour charger les données dans la nouvelle table, il suffit de procéder comme suit.

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

Si vous voulez vraiment les instructions INSERT, la seule façon que je connaisse est d'utiliser mysqldump http://dev.mysql.com/doc/refman/5.1/en/mysqldump.htm . Vous pouvez lui donner des options pour ne vidanger que les données d'une table spécifique et même limiter le nombre de lignes.

11voto

Laptop Lifts Points 136

J'ai écrit une fonction php qui permet de faire cela. J'avais besoin d'une instruction d'insertion au cas où un enregistrement devrait être remplacé après avoir été supprimé d'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;
}

10voto

chinoto Points 81

Le code de Laptop Lift fonctionne bien, mais j'ai pensé qu'il y avait quelques petites choses qui pourraient plaire aux gens.

Le gestionnaire de base de données est un argument, il n'est pas codé en dur. Utilisation de la nouvelle api mysql. Remplacement de $id par un argument optionnel $where pour plus de flexibilité. Utilisation de real_escape_string au cas où quelqu'un aurait déjà essayé de faire de l'injection sql et pour éviter les ruptures simples impliquant des guillemets. Utilisation de l'option INSERT table (field...) VALUES (value...)... de sorte que les champs ne soient définis qu'une seule fois et qu'il suffise ensuite d'énumérer les valeurs de chaque ligne (implode est génial). Parce que Nigel Johnson l'a signalé, j'ai ajouté NULL manipulation.

J'ai utilisé $array[$key] parce que je craignais qu'elle ne change d'une manière ou d'une autre, mais à moins d'un problème grave, elle ne devrait pas changer de toute façon.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X