Obtenir une déclaration d’insertion pour une ligne existante dans MySQL

En utilisant MySQL je peux lancer la requête:

SHOW CREATE TABLE MyTable; 

Et il retournera 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 firebase database.

Est-il possible d’obtenir l’instruction insert pour une ligne existante ou un ensemble de lignes? Certaines tables ont de nombreuses colonnes et il serait intéressant que je puisse obtenir une instruction d’insertion pour transférer des lignes vers une autre firebase database sans avoir à écrire l’instruction insert ou sans exporter les données vers CSV, puis importer les mêmes données. dans l’autre firebase database.

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

 SHOW INSERT Select * FROM MyTable WHERE ID = 10; 

Et faites ce qui suit pour moi:

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

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 suggéré par Rob. Spécifiez -t pour omettre la création de la table.

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

Dans MySQL Workbench, vous pouvez exporter les résultats de toute requête sur une seule table sous la forme d’une liste d’instructions INSERT . Lancez simplement la requête, puis:

Bouton Instantané de l'exportation

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

J’ai écrit une fonction php qui fera cela. Je devais faire une instruction d’insertion si un enregistrement devait être remplacé après la suppression 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 = sortingm($insertSQL, ", "); return $insertSQL; } 

Puisque vous avez copié la table avec le SQL produit par SHOW CREATE TABLE MyTable , vous pouvez simplement effectuer les opérations suivantes 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/en/mysqldump.htm . Vous pouvez lui donner des options pour simplement sauvegarder des données pour une table spécifique et même limiter les lignes.

Le code de Laptop Lift fonctionne bien, mais il y avait quelques petites choses que je pensais que les gens pourraient aimer.

Le gestionnaire de firebase database est un argument, non codé en dur. Utilisé le nouvel API mysql. Remplacé $ id par un argument $ facultatif pour la flexibilité. Utilisé real_escape_ssortingng au cas où quelqu’un aurait déjà essayé de faire une injection SQL et d’éviter les ruptures simples impliquant des guillemets. Utilisé la INSERT table (field...) VALUES (value...)... pour que les champs ne soient définis qu’une seule fois et qu’il suffit ensuite de lister les valeurs de chaque ligne (l’implode est génial). Comme Nigel Johnson l’a souligné, j’ai ajouté la gestion NULL .

J’ai utilisé $array[$key] parce que je craignais que cela change d’une manière ou d’une autre, mais à moins que quelque chose ne soit horriblement mauvais, cela ne devrait pas du tout ê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_ssortingng($value)."'"); } $values[]="(".implode(",",$temp).")"; } $num=$result->num_rows; return "INSERT `{$table}` (".implode(",",$fields).") VALUES \n".implode(",\n",$values).";"; } ?> 

J’utilise le programme SQLYOG où je peux faire une requête de sélection, pointez sur capture d'écran les résultats et choisissez exporter en tant que sql. Cela me donne les instructions d’insertion.

Dans le poste de travail MySQL, procédez comme suit:

  1. Cliquez sur Serveur> Exportation de données

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

  3. Ensuite, sélectionnez les tables souhaitées en utilisant 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.

vous pouvez utiliser Sequel pro pour ce faire, il y a une option pour “obtenir comme instruction d’insertion” pour les résultats obtenus

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 une déclaration d’insers:

INSERT INTO your_table ( field_1 , field_2 , ... , field_n ) VALUES (valeur_11, valeur_12, …, valeur_1n);

INSERT INTO your_table ( field_1 , field_2 , ... , field_n ) VALUES (valeur_21, valeur_22, …, valeur_2n);

/ …………………………………………. …. /

INSERT INTO your_table ( field_1 , field_2 , ... , field_n ) VALUES (valeur_m1, valeur_m2, …, valeur_mn);

, où m – nombre d’enregistrements dans votre_table

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; 

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; 

Je pense que la réponse fournie par Laptop Lifts est la meilleure… mais comme personne n’a suggéré l’approche que j’utilise, je me suis dit que je devrais utiliser le carillon. J’utilise phpMyAdmin pour configurer et gérer mes bases de données la plupart du temps. Dans ce document, vous pouvez simplement cocher les lignes souhaitées et, en bas, cliquer sur “Exporter” et choisir SQL. Il vous donnera des instructions INSERT pour les dossiers que vous avez sélectionnés. J’espère que cela t’aides.

En fonction de vos commentaires, votre objective est de migrer les modifications de firebase database d’un environnement de développement vers un environnement de production.

La meilleure façon de procéder consiste à conserver les modifications de votre firebase database dans votre code source et, par conséquent, à les suivre dans votre système de contrôle source, tel que git ou svn.

vous pouvez être rapidement opérationnel avec quelque chose comme ceci: https://github.com/davejkiger/mysql-php-migrations

en tant que solution personnalisée de base en PHP, vous pouvez utiliser une fonction comme celle-ci:

 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)); } } 

vous pouvez alors créer un script de migration qui mettra à jour tout environnement selon vos spécifications.