gpt4 book ai didi

Mysql - 我如何查询过去(回到过去)?

转载 作者:太空宇宙 更新时间:2023-11-03 11:12:50 24 4
gpt4 key购买 nike

我有一个数据库,它总是在变化……更新、插入和删除。出于统计原因,我们需要一些时间“回到过去”(-:并像过去一样查询数据库。

例如:我有一个名为 user 的表,我昨天更新了其中一个用户,如下所示:

update user set status = 1 where user_id = 2656

旧的 status 是 0,所以如果我能“回到过去”到昨天并查询它,我会得到 status 0,如果我现在查询,我得到 status 1.
我知道一种方法是触发更新,插入和删除并将其记录到不同的表,但它不是那么干净,并且会使开发变得复杂。

我希望你没听错,对不会说英语的人解释起来不是那么简单...

编辑-1
我们在应用程序中几乎没有算法,我们总是修复它们并升级它们,我们必须知道数据库过去的情况,这样我们才能处理算法,我们有可以更改的查询/接口(interface)来支持它(我是意识到这不是一个为期一周的项目,我们有资源)

谢谢

最佳答案

选项 1 启用二进制日志
这将保护所有更新、插入和删除。
binlog有查询工具。

参见:
http://dev.mysql.com/doc/refman/5.0/en/binary-log.html
http://www.mydigitallife.info/how-to-read-mysql-binary-log-files-binlog-with-mysqlbinlog/

选项 2 创建一个触发器来保存更改
触发器将数据保存到与原始数据库具有相同布局的并行数据库中,除了所有表都有两个额外的字段。一个名为 log_id 的唯一 ID 和一个时间戳。每当字段更改时,您都会在日志中登录触发器。
您至少需要一个 after_update 和 after_delete 触发器,我也推荐一个 after_insert 触发器。如果您愿意,可以向每个名为 operation 的表添加第三个字段,这是一个 ENUM('insert','delete','update')

DELIMITER $$

CREATE TRIGGER au_table1_each AFTER UPDATE ON table1 FOR EACH ROW
BEGIN
insert into back_to_the_past.table1_log (`timestamp`,operation,f1,f2,f3.f4)
values (now(), 'update', OLD.f1, OLD.f2, OLD.f3, OLD.f4);
END $$

DELIMITER ;

当然,如果您在 table1_log 中创建一个额外的时间戳类型字段,您不需要将它显式地传递给 now(),DB 会这样做。

参见:http://dev.mysql.com/doc/refman/5.0/en/triggers.html

关于Mysql - 我如何查询过去(回到过去)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7360874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com