2011-09-29 74 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

好的,使用臨時表是正確的方法。 –