MySQL中的增量更新表

时间:2012-04-18 15:59:29

标签: mysql insert

我正在处理一些高容量但不是非常可变的数据,并希望维护一个变更表(称之为update_history),以及一个保存当前数据的表(称之为{ {1}})。

  • current_data包含:current_data(唯一),idvalue(当前时间戳)
  • tstamp包含:update_history(再次,唯一),idvalue(适用于所有更新),tstamp

假设我有delete = 1的某些数据。在时间0,它被初始化为10,在时间5,它被更改为2,在时间8被删除,并且在时间10再次被设置为10。所有这些,我希望id包含:

update_history

虽然我可以在每次更改Id Value Stamp Delete 1 10 0 0 1 2 5 0 1 2 8 1 1 10 10 0 表时选择update_history,但看看值是否已更改,或者ID是否已删除并插入一行,这似乎有些过分。

我正在寻找一种在一两个查询中批量执行此操作的方法。特别是,我正在寻找一个查询,它会检查current_dataidupdate_history的相应id,以及最新current_data的值是否不匹配找不到tstamp中的idupdate_historyidvaluestampdelete = 0。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果您希望持续这样做,那么我会在MySQL中阅读TRIGGERS

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

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。