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

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

update user set status = 1 where user_id = 2656


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

希望您说对了,不要这么简单就不用讲英语。

编辑1
我们的应用程序中只有很少的算法,我们需要对其进行修复并始终进行升级,我们必须了解数据库的过去情况,这样我们才能使用算法,我们可以更改查询/接口来支持该算法(我是意识到这不是一个为期一周的项目,我们有足够的资源来解决这一问题)

谢谢

最佳答案

选项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的unidue 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()中,数据库便会这样做。

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

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

10-10 02:22