2011-09-29 52 views
4

我正在处理时间序列数据,其中的关键列是时间戳:时间。 每行也有很多“值”列。移动整个键的范围

我即将将数据的整个范围转移几个小时(由于夏令时问题)。 为此,我将更新多行的密钥,并可能导致一些重复的密钥。我希望日期范围边缘的重复键被忽略。我想要移动的范围覆盖旧的。

我打算做这样的事情:

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

当你说时间戳你的意思是时间戳字段类型或一个实际的整数?其次,这是一个独特的关键? DESCRIBE或SHOW CREATE TABLE的输出将会很有帮助。 – wisefish

+0

我已经在问题中添加了描述的输出。不管怎么说,昨天我得到了一个很好的安慰:它使用临时表来复制这个并使用“REPLACE”/“ignore”。我即将投票,但今天没有通知。 这可能是SO的错误或作者因某种原因删除它的错误。 –

+0

桌子使用什么引擎?它是InnoDB吗? – Romain

回答

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; 
+0

好的,使用临时表是正确的方法。 –