使用MySQL我可以运行查询:
SHOW CREATE TABLE MyTable;
它将返回特定表的create table语句。如果您已经创建了一个表,并且想要在另一个数据库上创建相同的表,这将非常有用。
是否可以获取已存在的行或行集的insert语句?有些表有很多列,如果能够获取一个insert语句将行传输到另一个数据库而不必写出insert语句,或者不将数据导出到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');
答案 0 :(得分:132)
似乎没有办法从MySQL控制台获取INSERT
语句,但你可以像Rob建议的那样使用 mysqldump 来获取它们。指定-t
以省略表创建。
mysqldump -t -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10"
答案 1 :(得分:45)
在MySQL Workbench中,您可以将任何单表查询的结果导出为R4
语句列表。只需运行查询,然后:
INSERT
附近的软盘Export/Import
选择Format
SQL INSERT statements
Save
答案 2 :(得分:10)
我写了一个php函数来做到这一点。我需要制作一个insert语句,以防在删除历史表后需要替换记录:
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;
}
答案 3 :(得分:10)
由于您使用 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。您可以选择仅转储特定表的数据,甚至限制行。
答案 4 :(得分:9)
笔记本电脑电梯的代码运行良好,但有一些我认为人们可能喜欢的东西。
数据库处理程序是一个参数,而不是硬编码。使用了新的mysql api。将$ id替换为可选的$ where参数以获得灵活性。如果有人试图进行sql注入并避免涉及引号的简单破坏,请使用real_escape_string。使用INSERT table (field...) VALUES (value...)...
语法,以便只定义一次字段,然后列出每行的值(内部很棒)。因为奈杰尔约翰逊指出,我添加了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).";";
}
?>
答案 5 :(得分:6)
我使用程序SQLYOG我可以在其中进行选择查询,指向结果并选择export为sql。这给了我插入语句。
答案 6 :(得分:4)
在MySQL工作台中执行以下操作:
点击服务器&gt;数据导出
在“对象选择”选项卡中,选择所需的架构。
接下来,使用架构右侧的列表框选择所需的表格。
选择要导出脚本的文件位置。
单击“完成”。
导航到新创建的文件并复制插入语句。
答案 7 :(得分:4)
如果你想为你的表获得“插入语句”,你可以尝试以下代码。
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`;
因此,您将拥有不公正声明:
INSERT INTO your_table
(field_1
,field_2
,...
,field_n
)VALUES(value_11,value_12,...,value_1n);
INSERT INTO your_table
(field_1
,field_2
,...
,field_n
)VALUES(value_21,value_22,...,value_2n);
/ .............................................. ....... /
INSERT INTO your_table
(field_1
,field_2
,...
,field_n
)VALUES(value_m1,value_m2,...,value_mn);
,其中m - your_table中的记录数
答案 8 :(得分:3)
你可以使用Sequel pro来做到这一点,有一个选项'获取插入语句'获得的结果
答案 9 :(得分:3)
在PHPMyAdmin中,您可以:
如果您选择了多个行,然后一次单击,则可以一次将其应用于表格的底部,然后单击“预览SQl”
答案 10 :(得分:2)
以下命令将转储到终端中,而没有 mysqldump 将围绕 INSERT 输出的所有额外内容。这允许从终端复制而不写入文件。如果环境限制写入新文件,这很有用。
mysqldump -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10" --compact --no-create-info --complete-insert --quick
使用 mysqldump --help
我找到了以下选项。
-q, --quick
不要缓冲查询,直接转储到标准输出。
(默认为开启;使用 --skip-quick 禁用。)
-t, --no-create-info
不要写表创建信息。
-c, --complete-insert
使用完整的插入语句。
--compact
给出较少详细的输出(用于调试)。禁用
结构注释和页眉/页脚构造。启用
选项 --skip-add-drop-table --skip-add-locks
--skip-comments --skip-disable-keys --skip-set-charset。
答案 11 :(得分:1)
使用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;
答案 12 :(得分:1)
您可以使用以下代码创建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;
答案 13 :(得分:1)
对于HeidiSQL用户:
如果使用HeidiSQL,则可以选择要获取插入语句的行。然后右键单击>导出网格行>为“输出目标”选择“复制到剪贴板”,为“行选择”选择“选择”,这样就不会导出其他行,为“输出格式”选择“ SQL INSERT”>单击“确定”。
insert语句将在剪贴板中。
答案 14 :(得分:1)
有一个非常简单且有用的解决方案,可以创建用于编辑的 INSERT 语句,而无需仅通过复制和粘贴(剪贴板)导出 SQL:
答案 15 :(得分:0)
我认为笔记本电脑升降机提供的答案是最好的...但是由于没有人建议我使用的方法,我想我应该插话。我使用phpMyAdmin来设置和管理我的数据库大部分时间。在其中,您只需在所需行旁边放置复选标记,然后在底部单击“导出”并选择SQL。无论您选择哪条记录,它都会为您提供INSERT语句。希望这会有所帮助。
答案 16 :(得分:-1)
根据您的意见,您的目标是将数据库更改从开发环境迁移到生产环境。
执行此操作的最佳方法是在源代码中更改数据库,然后在源代码管理系统中跟踪它们,例如git或svn。
您可以使用以下内容快速启动并运行:https://github.com/davejkiger/mysql-php-migrations
作为PHP中非常基本的自定义解决方案,您可以使用如下函数:
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));
}
}
然后您可以创建一个迁移脚本,它将根据您的规范更新任何环境。