2011-12-02 31 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之后手动。