获取MySQL中现有行的Insert语句

时间:2010-10-20 13:28:07

标签: mysql syntax

使用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');

17 个答案:

答案 0 :(得分:132)

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

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

答案 1 :(得分:45)

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

Snapshot of export button

  1. 点击结果上方INSERT附近的软盘
  2. 为目标文件命名
  3. 位于窗口底部,Export/Import选择Format
  4. 点击SQL INSERT statements
  5. 点击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我可以在其中进行选择查询,指向screenshot结果并选择export为sql。这给了我插入语句。

答案 6 :(得分:4)

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

  1. 点击服务器&gt;数据导出

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

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

  4. 选择要导出脚本的文件位置。

  5. 单击“完成”。

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

答案 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_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中的记录数

答案 8 :(得分:3)

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

答案 9 :(得分:3)

在PHPMyAdmin中,您可以:

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

Select copy

  1. 点击预览SQL:

Select Preview

  1. 您将获得创建的插入语句,该语句将生成它

如果您选择了多个行,然后一次单击,则可以一次将其应用于表格的底部,然后单击“预览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”>单击“确定”。

enter image description here

insert语句将在剪贴板中。

答案 14 :(得分:1)

有一个非常简单且有用的解决方案,可以创建用于编辑的 INSERT 语句,而无需仅通过复制和粘贴(剪贴板)导出 SQL:

  • 在 MySQL Workbench 的查询结果窗口中选择一行,甚至可能是几行。即使该行包含的数据与我想在脚本中插入的数据不同,或者当目标是使用 ?占位符。
  • 将剪贴板中复制的行粘贴到同一个表中(查询结果列表是工作台中的编辑器)到最后一个空闲行。
  • 按“应用”,然后会打开一个窗口,向您显示 INSERT 语句 - 请勿执行
  • 将 SQL 从窗口复制到剪贴板
  • 取消执行,从而不更改数据库而是将 SQL 保留在剪贴板中。
  • 将 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));
    }
}

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