我如何实现对 mysql 数据库的撤消更改功能,就像 Gmail 删除/移动/标记电子邮件时一样。
到目前为止,我有一个系统日志表,其中包含用户执行的确切的 sql 语句。
例如,我正在尝试转换:
INSERT INTO table (id, column1, column2) VALUES (1,'value1', 'value2')
进入:
DELETE FROM table WHERE id=1, column1='value1', column2='value2'
是否有内置函数可以像 cisco 路由器命令那样执行此操作,例如
(NO|UNDO|REVERT) INSERT INTO table (id, column1, column2) VALUES (1,'value1', 'value2')
也许我的方法不正确,我是否应该保存我的行的当前状态和更改的行以恢复到它的原始状态?
类似于:
original_query = INSERT INTO table (id, column1, column2) VALUES (1,'value1', 'value2')
executed_query = INSERT INTO table (id, column1, column2) VALUES (1,'change1', 'change2')
稍后转换为:
INSERT INTO table (id, column1, column2) VALUES (1,'value1', 'value2') ON DUPLICATE KEY UPDATE
column1=VALUES(column1), column2=VALUES(column2)
但它可能不适用于新插入的行,或者如果我修改主键可能会导致麻烦,所以我宁愿让它们保持不变。
这是我的日志表:
CREATE TABLE `log` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT ,
`date` datetime NOT NULL ,
`user` int(11) NOT NULL,
`client` text COMMENT ,
`module` int(11) unsigned NOT NULL ,
`query` text NOT NULL ,
`result` tinyint(1) NOT NULL ,
`comment` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
目标就像我说的,根据语句执行的日期撤消特定时间段的更改,例如(可以在 php 中)
function_undo(startdate, enddate)
{
RESULT = SELECT query FROM log WHERE date BETWEEN startdate AND endate
FOR EACH RESULT AS KEY - query
REVERT query
}
或撤消按钮以恢复单个操作(单个记录的查询)。
我对这种“增量备份更改”的概念是正确的,还是我把一切都复杂化了? 考虑到一个明显的事实,如果我存储完整的查询,我的数据库的大小将是两倍或三倍。我应该将它存储在不同的数据库中吗?或者在我进行程序化完整备份后简单地删除日志表以仅保留最近的更改?
欢迎任何建议...
最佳答案
这一直是个问题,SQL 2012 解决了这个问题。 时间模型很简单:添加区间列(valid_from, valid_to),但实现约束非常复杂。 模型操作也很简单:
1. insert - new version valid_from=now, valit_to=null 2. update - new version valid_from=now, valit_to=null, update previous version valit_to=now 3. delete - update current version valit_to=now 4. undo delete - update last version valit_to=null 5. undo update/insert - delete current version if you do not need redo and update valit_to=null if previous version exits
重做更复杂但相似,通常此模型用于数据仓库中以跟踪更改而不是重做功能,但重做也应该没问题。它也被称为数据仓库中缓慢变化的维度。
关于php - 恢复sql语句的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21494682/