【问题标题】:How to get original insert statement from database [duplicate]如何从数据库中获取原始插入语句[重复]
【发布时间】:2012-10-06 01:28:25
【问题描述】:

可能重复:
Get Insert Statement for existing row in MySQL

假设我们有一个名为 users 的表:

CREATE TABLE IF NOT EXISTS users(
UID int(11) PRIMARY KEY NOT NULL auto_increment,
fname varchar(100) default NULL,
lname varchar(100) default NULL,
username varchar(20) default NULL UNIQUE,
password blob   
)ENGINE=InnoDB DEFAULT CHARSET=utf8

假设表格中有几行已填满。 我知道有一个查询返回表的创建 - > SHOW CREATE TABLE users 但我希望重新创建单独的插入语句以将它们保存在日志中......我知道这听起来很奇怪,但我正在制作一个自定义 CMS,其中记录了所有内容,并希望更新/删除的行可以在某个时间点回滚...因此我需要从表数据中重新创建精确的插入查询(我已经在整个网络上搜索了答案但找不到...)

是否有一个查询会“自动”返回按主键插入特定行的查询?

我正在寻找可以执行此操作的查询:

SHOW INSERT FROM users WHERE PRIMARY_KEY=2

返回:

INSERT INTO users (UID,fname,lname,username,password) VALUES (2,'somename','somelastname','someusername','someAESencryptedPassword')

我认为这样的查询存在/可能的原因是,当您使用 php myadmin (cpanel) 备份数据库并打开文件时,您实际上可以查看每个插入以重新创建包含所有行的表那个时间点……

【问题讨论】:

  • PhpMyAdmin 只需手动将数据库导出为 SQL 格式。我相信您正在寻找的命令附近没有任何东西。但是,您可能会发现像 PhpMyAdmin 一样从表结构和数据生成插入语句的好脚本。
  • 我很确定没有这样的命令,但是用 php 编写它不会花费太多!
  • 您是否需要它以与最初执行相同的顺序返回 INSERT 语句?还是任何有效的 INSERT 语句集合都足够好?如果是后者,mysqldump 应该做你想做的事。

标签: php mysql return-value


【解决方案1】:

没有这样的命令来检索原始插入语句。但是,您始终可以根据现有的表结构和数据重新制作插入语句。

以下链接可能会对您有所帮助,这已经被问到了:

Get Insert Statement for existing row in MySQL

另一个可能的选择是使用mysqldump 和php 将数据导出为SQL 语句。

【讨论】:

  • 您始终可以将二进制数据转换为 base64 字符串。插入语句将包含 base64 字符串和转换回二进制的脚本。
【解决方案2】:

没有这样的“命令”(数据被存储,但不是插入它的实际 SQL),按照你的要求去做是没有意义的。你确实意识到你的“日志”会比实际的表和数据本身大 20 倍(至少)?无论如何,如果不做大量工作来追踪它(参见下面的 cmets),它就无法检索 INSERT 语句。

研究事务性 SQL,利用服务器日志记录和事务,并像你应该做的那样定期备份数据,并停止尝试重新发明轮子。 :-)

【讨论】:

  • @Adrian:他们呢?如果您正确使用它们(事务、备份等),它们就会很有用(作为二进制日志)。 “不要重新发明轮子”的哪一部分不清楚?如果您一开始就正确地做事,则无需mysqlbinlog 任何事情。我应该否决您的回答,因为您建议不恰当地使用应该用于紧急恢复的东西?
  • 我的观点是反对There is no such "command" 。我猜 OP 正在寻找审计日志 - 如果没有 - 这会起作用
  • 我的意思是,您推荐的“命令”是为紧急恢复而设计的,而不是为日常事务日志记录而设计的,并且它不执行问题所要求的(返回用于最初创建某个记录”)。不过没关系。你决定在哪里花费你的代表投票。 :-) 没问题。
  • 它怎么不显示应用到数据库的插入 - 我是不是有点傻?
  • 没有。你错过了问题的一部分。 “返回原始插入语句”是问题所在。能够产生一个 new 插入语句不是一回事 - 关于 original 插入语句的问题。您知道,用户“Jeff”大约在一年前在某处运行,然后该行被其他 6 个用户的多次更新修改。是的,那个。快点给我制作出来,好吗?使用任何你喜欢的方式。
猜你喜欢
  • 2021-11-04
  • 1970-01-01
  • 2019-01-27
  • 2019-11-11
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2023-02-01
相关资源
最近更新 更多