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


139

使用MySQL我可以运行查询:

SHOW CREATE TABLE MyTable;

然后它将返回特定表的create table语句。如果您已经创建了一个表,并且想在另一个数据库上创建相同的表,这将很有用。

是否可以为一个已经存在的行或一组行获取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');

您使用什么工具连接数据库?一些程序提供了此类模板。
2010年

2
@kibbee,您对此有任何解决方案吗?
哈西娜2013年

2
希望从mysql>提示中显示INSERT语句的答案。到目前为止没有。
鲍勃·斯坦

您是否找到了任何解决方案,以编程方式获取insert语句?
Vaibhav Jain's

Answers:


155

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

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

如果收到错误mysqldump,请参见此:无法执行'SELECT @@ GTID_MODE':未知系统变量'GTID_MODE'(1193) gist.github.com/arun057/5556563
Daniel Schaffer

10
如果希望使用插入语句添加字段/列名称,则可以添加“ --complete-insert”
MeatPopsicle

3
--single-transaction
FelikZ

并且--hex-blob,如果您有BLOB列(例如bit(1)),它会写为字符串,否则,这可能导致在Unknown command '\0'执行INSERT时错误。
moffeltje

79

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

导出按钮快照

  1. 单击Export/Import结果上方附近的软盘
  2. 给目标文件起个名字
  3. 在窗口底部,用于Format选择SQL INSERT statements
  4. 点击 Save
  5. 点击 Export

2
另外,右侧的图标非常适合导入您刚刚创建的导出。非常好的功能。唯一棘手的部分是,选择后只能从结果集面板访问图标。
Half_Duplex

13

由于您使用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。您可以为它提供选项,使其仅转储特定表的数据甚至限制行。


有问题的数据库存在于物理上不同的机器上,位于不同的网络上,因此该方法对我而言不起作用,但适用于在同一MySQL实例上运行的数据库
Kibbee,2010年

您是否要以编程方式在计算机之间移动数据子集?您不能从第二台机器上进行镜像数据,然后在从机上的数据库之间移动子集吗?
Rob Prouse 2010年

1
出于争论的原因,让我们说我有一个包含时区的表。现在,由于某种原因,创建了一个新的时区(可能有15分钟的偏移量或类似的时间)。因此,我将新行添加到包含有关新时区的所有信息的开发数据库中,并进行所有必要的测试。当需要将该时区信息移至生产数据库时,我必须从头开始创建一条插入语句,或者进行导出/导入。能够只获取插入内容,然后将其包含在脚本中以使新时区生效将是很好的。
Kibbee

1
我没有原始插入内容,因为我可能已经使用GUI工具将其插入,或者可能不得不将其与插入的原始值进行3次更改。
Kibbee 2010年

1
我碰巧需要使用同一台计算机上的数据库的简单解决方案,而google将我带到这里。因此,即使这个答案与原始问题无关,我也很感谢:)
Jason McCarrell 2015年

10

我写了一个php函数来做到这一点。我需要制作一条插入语句,以防在删除历史记录表后需要替换记录:

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
该解决方案非常脆弱。例如,如果您的记录之一包含name O' Malley,则由于单引号不匹配,所生成的查询将具有语法错误。mysql_real_escape_string如果走这条路,至少应该使用。
埃里克·海斯特兰德

仍然不错的东西,我会确定使用它
user7082181

9

Laptop Lift的代码可以正常工作,但是我认为人们可能会喜欢一些东西。

数据库处理程序是一个参数,不是硬编码的。使用了新的mysql API。$ id替换为可选的$ where参数以提高灵活性。如果有人试图进行sql注入并避免涉及引号的简单损坏,请使用real_escape_string。使用INSERT table (field...) VALUES (value...)...语法,以便仅定义一次字段,然后仅列出每行的值(爆破效果很棒)。因为奈杰尔·约翰逊(Nigel Johnson)指出了这一点,所以我添加了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).";";
}
?>

不确定缺少的内容INTOINSERT INTO {$tables}但表中没有空值的处理。
奈杰尔·约翰逊

1
@NigelJohnson INTO是完全可选的。我添加了对null的处理。
Chinoto Vokro 2014年

6

我使用SQLYOG程序,可以在其中进行选择查询,指向屏幕截图结果,然后选择export as sql。这给了我插入语句。


为了避免混淆,它表示为sql格式,但实际上以mysql格式导出。
Kumar Vikramjeet

谢谢...。+ 1对我有用。但是无法仅获取选定的行。:(你的方法给插入查询表中的所有行。
Mukit09

5

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

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

  2. 在“对象选择”选项卡中,选择所需的架构。

  3. 接下来,使用模式右侧的列表框选择所需的表。

  4. 选择一个文件位置以导出脚本。

  5. 单击完成。

  6. 导航到新创建的文件并复制insert语句。


这是全表导出,而不是特定的行导出
Yehia

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_tablefield_1field_2...field_n)VALUES(value_11,value_12,...,value_1n);

INSERT INTO your_tablefield_1field_2...field_n)VALUES(value_21,value_22,...,value_2n);

/ .................................................................. .... /

INSERT INTO your_tablefield_1field_2...field_n)VALUES(value_m1,value_m2,...,value_mn);

,其中m-your_table中的记录数


4
您是否可以为您的答案提供更多信息,而不仅仅是粘贴的代码块?
马特·弗莱彻

是的,但这是硬编码的,field_ *是静态名称。它完成了一半的工作,而且做得不好
Daniele Cruciani

为什么选择GROUP_CONCAT?
Sealabr

3

您可以使用Sequel pro来执行此操作,对于获得的结果,可以选择“作为插入语句获取”


3

在PHPMyAdmin中,您可以:

  1. 在要了解其插入语句SQL的行上单击“复制”:

选择副本

  1. 单击预览SQL:

选择预览

  1. 您将获得创建它的插入语句

如果选择它们,可以一次将其应用于许多行,然后单击表底部的“复制”,然后单击“预览SQl”


为您的答案添加更多的解释和信息
Ramin eghbalian

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;

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;

1

对于HeidiSQL用户

如果使用HeidiSQL,则可以选择要获取插入语句的行。然后右键单击>导出网格行>为“输出目标”选择“复制到剪贴板”,为“行选择”选择“选择”,这样就不会导出其他行,为“输出格式”选择“ SQL INSERT”>单击“确定”。

在此处输入图片说明

插入语句将在剪贴板中。


0

我认为,Laptop Lifts提供的答案是最好的……但是由于没有人提出我使用的方法,因此我认为应该插手。大多数时候,我使用phpMyAdmin设置和管理数据库。在其中,您可以简单地在所需行旁边放置复选标记,然后在底部单击“导出”并选择SQL。它会为您选择的任何记录提供INSERT语句。希望这可以帮助。


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

然后您可以创建一个迁移脚本,该脚本将根据您的规范更新任何环境。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.