我正在处理时间序列数据,其中键列是时间戳:时间。 每行还有许多“值”列。
我准备将整个数据范围移动几个小时(由于夏令时问题)。 为此,我将更新几行的密钥,这可能会导致一些重复的密钥。我希望忽略日期范围边缘的重复键。我希望移位范围覆盖旧范围。
我打算做以下事情:
UPDATE IGNORE time_series_table
SET time=time-<some_shift>
WHERE <time in a date-range>
以下是时间键describe <table>
的输出:
Field Type Null Key Default Extra
TimeMeas datetime NO PRI NULL
我的问题是:它会一次性移动所有键,还是会尝试逐行移动每一行,从而在移位范围内产生大量重复键?
你有更好的方法来做到这一点吗? 提前致谢
答案 0 :(得分:3)
它会立即移动所有键,还是会尝试逐行移动每一行
它会立刻移动所有键。
在移位范围内产生大量重复键?
如果任何主键重复,它就会失败
使用update ignore
,它只是默默地跳过。
这是我解决此问题的方法
/* create a temporary table to store matches records*/
create table tmp_table select time-<some_shift>, etc_cols....
from time_series_table
where <time in a date-range>;
然后
/* delete the matches in the original table */
delete from time_series_table where <time in a date-range>;
delete from time_series_table where <time in a date-range - some_shift>;
最后
/* at this point, there won't be any duplicate data */
/* so, insert back into original table */
insert into time_series_table select * from tmp_table;
optmize table time_series_table;