在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
语句的列表导出。 只需运行查询,然后:
- 点击结果上面
Export/Import
附近的软盘 - 给目标文件一个名字
- 在窗口的底部,对于
Format
selectSQL INSERT statements
- 点击
Save
- 单击
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工作台中执行以下操作:
-
单击服务器>数据导出
-
在“对象select”选项卡中select所需的模式。
-
接下来,使用架构右侧的列表框select所需的表格。
-
select一个文件位置来导出脚本。
-
点击完成。
-
导航到新创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一个迁移脚本,将更新任何环境到您的规格。