2011-12-02 57 views
0

我有一個表中有假數據,有40,000行,每行的時間戳增加幾毫秒。我想把這些行乘以10,每一行40,000行增加一天,一小時,無論我設定的是多少。向表本身添加表數據,增加時間戳

有沒有辦法從表中選擇數據,然後將其反饋回自己,其中一列稍有變化?

FWIW,這張桌子上有33列。

任何幫助表示讚賞!

回答

1

來自gustavotkg的mysql代碼沿着正確的線條。

INSERT INTO mytable (event_ts, col1, col2) 
SELECT event_ts + interval '1 day', col1, col2 
FROM mytable 
WHERE event_ts BETWEEN <something> AND <something else> 

對於多個副本重複不同的間隔。

+0

是!謝謝。由於獨特的ID約束和日期範圍約束,我不得不做一些本地調整,但這基本上工作。 – Smittles

0

目前還不清楚您是要更新行還是同時選擇它們,或者甚至插入新行。更新是很簡單的:(!更新狀態)

UPDATE tbl 
SET col1 = col1*10 
    ,ts = ts + interval '1 day' 

要還回像SELECT語句將所有行:

UPDATE tbl 
SET col1 = col1*10 
    , ts = ts + interval '1 day' 
RETURNING * 

如果你真的想INSERT新行只有一個列改變並且時間戳改變了,並且要點避免必須輸出全部33列,你可以:

CREATE TEMP TABLE tbl_tmp AS SELECT * FROM tbl; 
UPDATE tbl_tmp SET col1 = col1*10, ts = ts + interval '1 day'; 
INSERT INTO tbl SELECT * FROM tbl_tmp; 
DROP tbl_tmp; 

或新型writable CTEs略快於9.1版本:

CREATE TEMP TABLE ON COMMIT DROP tbl_tmp AS SELECT * FROM tbl; 
WITH x AS (
    UPDATE tbl_tmp SET col1 = col1*10, ts = ts + interval '1 day' 
    RETURNING * 
    ) 
INSERT INTO tbl SELECT * FROM x; 
DROP tbl_tmp; 

一定要具有autovacuum運行或運行VACUUM ANALYZE之後手動。