0

我正在处理一些高容量但不是非常可变的数据,并且想要维护一个更改表(调用它update_history),以及一个保存当前数据的表(调用它current_data)。

  • current_data包含:(id这是唯一的),,valuetstamp当前时间戳)
  • update_history包含:(id这也是唯一的),,valuetstamp对于所有更新),delete

假设我有id= 1 的某些数据。在时间 0 初始化为 10,在时间 5 更改为 2,在时间 8 删除,在时间 10 再次设置为 10。毕竟,我想要update_history包含装有:

Id Value Stamp Delete 
1    10     0     0
1     2     5     0
1     2     8     1
1    10    10     0

虽然我可以从update_history对表的每次更改中进行选择current_data,但查看值是否已更改,或者是否删除了 id 并插入了一行,但这似乎有点过分。

我正在寻找一种在一个或两个查询中批量执行此操作的方法。特别是,我正在寻找一个查询,它检查每个in的对应idin ,如果未找到最新或in的值不匹配,则插入一行, , , =0。update_historyidcurrent_datatstampidupdate_historyidvaluestampdelete

任何帮助将不胜感激。

4

1 回答 1

1

如果您希望持续执行此操作,那么我会阅读有关MySQL中的触发器的信息。

否则,如果这是一次性任务,那么您可以在两个查询中完成。首先识别当前表中与历史中最后一个值不同的所有行,并在历史中插入新行

INSERT INTO update_history SELECT cd.id,cd.value,UNIX_TIMESTAMP(),0
FROM current_data cd 
INNER JOIN update_history uh1 ON ( cd.id=uh1.id AND cd.value!=uh1.value AND uh1.delete=0)
WHERE uh1.stamp = (
SELECT MAX(stamp) 
FROM update_history uh2
WHERE uh2.id=cd.id
)

然后识别在历史记录中没有条目的任何当前行

INSERT INTO update_history SELECT cd.id,cd.value,UNIX_TIMESTAMP(),0
FROM current_data cd 
LEFT JOIN update_history uh1 ON cd.id=uh1.id 
WHERE uh1.id IS NULL

我相信您的设计存在一些缺陷。例如,如果两个更改同时发生(就时间戳而言),会发生什么?您如何确定哪个是“第一”?您可能需要历史记录表上的唯一 ID。

于 2012-04-18T18:21:04.043 回答