获取MySQL中现有行的Insert语句

Kib*_*bee 121 mysql syntax

使用MySQL我可以运行查询:

SHOW CREATE TABLE MyTable;
Run Code Online (Sandbox Code Playgroud)

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

是否可以获取已存在的行或行集的insert语句?有些表有很多列,我很高兴能够获得一个insert语句将行传输到另一个数据库而不必写出insert语句,或者不将数据导出到CSV然后导入相同的数据进入其他数据库.

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

SHOW INSERT Select * FROM MyTable WHERE ID = 10;
Run Code Online (Sandbox Code Playgroud)

并为我返回以下内容:

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

Kai*_*aja 141

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

mysqldump -t -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10"
Run Code Online (Sandbox Code Playgroud)

  • 如果希望字段/列名称带有insert语句,则可以添加"--complete-insert" (7认同)
  • `--compact` 消除了所有的麻烦,只得到 `insert` 语句本身。 (4认同)
  • 和 `--hex-blob` 如果你有 blob 列(例如 `bit(1)`),它会将其写为字符串,否则,这可能会导致执行 INSERT 时出现 `Unknown command '\0'` 错误。 (3认同)
  • -单笔交易 (2认同)

Zol*_*tán 64

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

导出按钮的快照

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

  • 此外,右侧的图标对于导入您刚刚创建的导出非常方便。非常好的功能。唯一棘手的部分是,您只能在选择后从结果集面板访问图标。 (5认同)
  • 非常感谢。正是我想要的 (2认同)

Rob*_*use 12

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

INSERT INTO dest_db.dest_table SELECT * FROM source_db.source_table;
Run Code Online (Sandbox Code Playgroud)

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


Mos*_*zli 11

在 PHPMyAdmin 中您可以:

  1. 单击您想了解其插入语句 SQL 的行上的复制:

选择副本

  1. 单击预览 SQL:

选择预览

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

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


Chr*_*ams 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案非常脆弱.例如,如果您的某个记录包含名称"O'Malley",则由于单引号不匹配,生成的查询将出现语法错误.如果走这条路,你至少应该使用`mysql_real_escape_string`. (3认同)

Gab*_*tes 10

下面的命令将转储到终端,而不包含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。


Chi*_*kro 9

笔记本电脑电梯的代码工作正常,但有一些我认为人们可能喜欢的东西.

数据库处理程序是一个参数,而不是硬编码.使用了新的mysql api.将$ id替换为可选的$ where参数以获得灵活性.如果有人试图进行sql注入并避免涉及引号的简单破坏,请使用real_escape_string.使用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).";";
}
?>
Run Code Online (Sandbox Code Playgroud)


Hen*_*rik 6

我使用程序SQLYOG,我可以在其中进行选择查询,指向截图结果并选择export为sql.这给了我插入语句.


Kev*_*sox 5

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

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

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

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

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

  5. 单击完成。

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


sla*_*157 5

如果您想为您的表获取“插入语句”,您可以尝试以下代码。

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`;
Run Code Online (Sandbox Code Playgroud)

结果,您将有insers语句:

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

  • 除了粘贴的代码块之外,您能否为您的答案提供更多信息? (4认同)

小智 5

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

  • 在MySQL Workbench的查询结果窗口中选择行,甚至可能是几行。即使该行确实包含与我想要在脚本中插入的数据不同的数据,或者目标是使用 ? 创建准备好的语句,我也会使用此选项。占位符。
  • 将剪贴板中复制的行粘贴到同一个表(查询结果列表是工作台中的编辑器)中的最后一个空闲行中。
  • 按“应用”,将打开一个窗口,显示 INSERT 语句 - 不要执行
  • 将 SQL 从窗口复制到剪贴板
  • 取消执行,因此不会更改数据库,而是将 SQL 保留在剪贴板中。
  • 将 SQL 粘贴到您想要的任何位置并根据需要进行编辑,例如插入 ? 占位符