我正在处理一些高容量但不是非常可变的数据,并希望维护一个变更表(称之为update_history
),以及一个保存当前数据的表(称之为{ {1}})。
current_data
包含:current_data
(唯一),id
,value
(当前时间戳)tstamp
包含:update_history
(再次,唯一),id
,value
(适用于所有更新),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_data
中id
中update_history
的相应id
,以及最新current_data
的值是否不匹配找不到tstamp
中的id
或update_history
,id
,value
,stamp
,delete
= 0。
任何帮助将不胜感激。
答案 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。