在MySQL中获取现有行的插入语句

使用MySQL我可以运行查询:

SHOW CREATE TABLE MyTable; 

它将返回特定表的create table语句。 如果您已经创build了一个表,并且希望在另一个数据库上创build相同的表,这将非常有用。

是否有可能得到一个已经存在的行或一组行的插入语句? 有些表有很多列,对于我来说,能够获得插入语句来将行传输到另一个数据库而不必写出插入语句,或者不将数据导出到CSV然后导入相同的数据进入另一个数据库。

只是为了澄清,我想要的是这样的工作,如下所示:

 SHOW INSERT Select * FROM MyTable WHERE ID = 10; 

并有以下回报给我:

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

似乎没有办法从MySQL控制台获取INSERT语句,但是可以像Robbuild议的那样使用mysqldump来获取它们。 指定-t省略表创build。

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

在MySQL Workbench中,您可以将任何单表查询的结果作为INSERT语句的列表导出。 只需运行查询,然后:

导出按钮的快照

  1. 点击结果上面Export/Import附近的软盘
  2. 给目标文件一个名字
  3. 在窗口的底部,对于FormatselectSQL INSERT statements
  4. 点击Save
  5. 单击Export

我写了一个PHP函数,将这样做。 如果logging需要在历史logging表的删除后被replace,我需要做一个插入语句:

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

由于您使用SHOW CREATE TABLE MyTable生成的SQL复制表,您可以执行以下操作将数据加载到新表中。

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

如果你真的想要INSERT语句,那么我知道的唯一方法是使用mysqldump http://dev.mysql.com/doc/refman/5.1/en/mysqldump.htm 。 你可以给它select只是为特定的表转储数据,甚至限制行。

笔记本电脑的代码工作正常,但有一些我想到的人可能会喜欢的东西。

数据库处理程序是一个参数,不是硬编码的。 使用新的MySQL API。 将$ idreplace为可选的$ where参数以获得灵活性。 使用real_escape_string在任何人曾经试图做sql注入,并避免简单的破损涉及报价。 使用INSERT table (field...) VALUES (value...)...语法,以便字段只定义一次,然后列出每行的值(implode是真棒)。 由于奈杰尔·约翰逊指出,我加了NULL处理。

我使用$array[$key]因为我担心它可能会改变,但除非有什么可怕的错误,否则不应该。

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

我使用程序SQLYOG ,我可以做一个select查询,指向 截图 结果并select导出为sql。 这给我插入语句。

在MySQL工作台中执行以下操作:

  1. 单击服务器>数据导出

  2. 在“对象select”选项卡中select所需的模式。

  3. 接下来,使用架构右侧的列表框select所需的表格。

  4. select一个文件位置来导出脚本。

  5. 点击完成。

  6. 导航到新创build的文件并复制插入语句。

你可以使用Sequel pro来做到这一点,有一个选项“获取插入语句”获得的结果

你可以用下面的代码创build一个SP,它也支持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; 

我认为,笔记本电脑提供的答案是最好的…但是由于没有人提出我使用的方法,我想我应该钟意。我使用phpMyAdmin来设置和pipe理我的数据库大部分时间。 在其中,您可以简单地将复选标记放在所需的行旁边,在底部点击“导出”并selectSQL。 它会给你INSERT语句你select的任何logging。 希望这可以帮助。

用PDO你可以这样做。

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

根据您的意见,您的目标是将数据库更改从开发环境迁移到生产环境。

做到这一点的最好方法是将数据库更改保存在源代码中,然后在源代码控制系统(例如git或svn)中跟踪它们。

你可以用这样的东西快速启动并运行: https : //github.com/davejkiger/mysql-php-migrations

作为PHP中非常基本的自定义解决scheme,您可以使用如下的函数:

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

那么您可以创build一个迁移脚本,将更新任何环境到您的规格。