Mysql 移动整个按键范围
我正在处理时间序列数据,其关键列是时间戳:time。 每行也有许多“值”列 由于夏令时的问题,我将把我的整个数据范围移动几个小时。 为此,我将更新几行的键,这可能会导致一些重复的键。我想重复的日期范围边缘的关键是忽略。我想让移位的范围覆盖旧的范围 我计划做如下事情:Mysql 移动整个按键范围,mysql,time-series,dst,on-duplicate-key,Mysql,Time Series,Dst,On Duplicate Key,我正在处理时间序列数据,其关键列是时间戳:time。 每行也有许多“值”列 由于夏令时的问题,我将把我的整个数据范围移动几个小时。 为此,我将更新几行的键,这可能会导致一些重复的键。我想重复的日期范围边缘的关键是忽略。我想让移位的范围覆盖旧的范围 我计划做如下事情: UPDATE IGNORE time_series_table SET time=time-<some_shift> WHERE <time in a date-range> 我的问题是:它会一次移动所
UPDATE IGNORE time_series_table
SET time=time-<some_shift>
WHERE <time in a date-range>
我的问题是:它会一次移动所有的关键点,还是会尝试一行一行地移动,从而在移动的范围内产生大量重复的关键点
你有没有更好的办法?
提前谢谢
它会一次移动所有键,还是会尝试一行一行地移动
它将同时移动所有键
在移动范围内产生大量重复的关键点
如果主键中的任何一个重复,则它将失败。使用
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>;
你说的时间戳是指时间戳字段类型还是实际的整数?第二,这是唯一的钥匙吗?descripe或showcreate表的输出将很有帮助。我在问题中添加了descripe的输出。无论如何昨天我得到了一个很好的答案:它是关于使用一个临时表来复制这个表,并使用“REPLACE”/“ignore”。我本来打算投赞成票的,但今天没有通知就没了。这可能是SO的错误或作者出于某种原因删除了它。表使用的是什么引擎?是InnoDB吗?
/* 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;